diff --git a/.github/workflows/certora-prover.yml b/.github/workflows/certora-prover.yml index f8556b756..39a62830a 100644 --- a/.github/workflows/certora-prover.yml +++ b/.github/workflows/certora-prover.yml @@ -50,7 +50,7 @@ jobs: - name: Install solc run: | pip install solc-select - solc-select use 0.8.12 --always-install + solc-select use 0.8.27 --always-install - name: Verify rule ${{ matrix.params }} run: | bash ${{ matrix.params }} diff --git a/.github/workflows/coverage.yml b/.github/workflows/coverage.yml index 6b57199f6..71f7eeb86 100644 --- a/.github/workflows/coverage.yml +++ b/.github/workflows/coverage.yml @@ -26,19 +26,20 @@ jobs: id: get_issue_number with: script: | - if (context.issue && context.issue.number) { - // Return issue number if present - return context.issue.number; + let issue_number; + // Attempt to find a pull request associated with the commit + const pullRequests = await github.rest.repos.listPullRequestsAssociatedWithCommit({ + commit_sha: context.sha, + owner: context.repo.owner, + repo: context.repo.repo, + }); + + if (pullRequests.data.length > 0) { + issue_number = pullRequests.data[0].number; } else { - // Otherwise return issue number from commit - return ( - await github.rest.repos.listPullRequestsAssociatedWithCommit({ - commit_sha: context.sha, - owner: context.repo.owner, - repo: context.repo.repo, - }) - ).data[0].number; + throw new Error('No associated issue or pull request found.'); } + return issue_number; result-encoding: string - name: Checkout code uses: actions/checkout@v2 diff --git a/.gitignore b/.gitignore index cb82d385c..3213174f1 100644 --- a/.gitignore +++ b/.gitignore @@ -47,3 +47,7 @@ InheritanceGraph.png surya_report.md .idea + +*state.json +deployed_strategies.json +populate_src* \ No newline at end of file diff --git a/certora/harnesses/DelegationManagerHarness.sol b/certora/harnesses/DelegationManagerHarness.sol index 9f2366ee6..05143f537 100644 --- a/certora/harnesses/DelegationManagerHarness.sol +++ b/certora/harnesses/DelegationManagerHarness.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.12; +pragma solidity ^0.8.27; import "../../src/contracts/core/DelegationManager.sol"; diff --git a/certora/harnesses/EigenPodHarness.sol b/certora/harnesses/EigenPodHarness.sol index 1845cff7a..a000e4954 100644 --- a/certora/harnesses/EigenPodHarness.sol +++ b/certora/harnesses/EigenPodHarness.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.12; +pragma solidity ^0.8.27; import "../../src/contracts/pods/EigenPod.sol"; diff --git a/certora/harnesses/EigenPodManagerHarness.sol b/certora/harnesses/EigenPodManagerHarness.sol index 84576ec9f..034425449 100644 --- a/certora/harnesses/EigenPodManagerHarness.sol +++ b/certora/harnesses/EigenPodManagerHarness.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.12; +pragma solidity ^0.8.27; import "../../src/contracts/pods/EigenPodManager.sol"; diff --git a/certora/harnesses/PausableHarness.sol b/certora/harnesses/PausableHarness.sol index fc0095ebe..2719eba6f 100644 --- a/certora/harnesses/PausableHarness.sol +++ b/certora/harnesses/PausableHarness.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.12; +pragma solidity ^0.8.27; import "../../src/contracts/permissions/Pausable.sol"; diff --git a/certora/harnesses/SlasherHarness.sol b/certora/harnesses/SlasherHarness.sol index 519895780..eab81659c 100644 --- a/certora/harnesses/SlasherHarness.sol +++ b/certora/harnesses/SlasherHarness.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.12; +pragma solidity ^0.8.27; import "../../src/contracts/core/Slasher.sol"; diff --git a/certora/harnesses/StrategyManagerHarness.sol b/certora/harnesses/StrategyManagerHarness.sol index 441037032..a8c1ba2a0 100644 --- a/certora/harnesses/StrategyManagerHarness.sol +++ b/certora/harnesses/StrategyManagerHarness.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.12; +pragma solidity ^0.8.27; import "../../src/contracts/core/StrategyManager.sol"; diff --git a/certora/scripts/core/verifyDelegationManager.sh b/certora/scripts/core/verifyDelegationManager.sh index 678b5a37c..dfec2c904 100644 --- a/certora/scripts/core/verifyDelegationManager.sh +++ b/certora/scripts/core/verifyDelegationManager.sh @@ -3,7 +3,7 @@ then RULE="--rule $2" fi -solc-select use 0.8.12 +solc-select use 0.8.27 certoraRun certora/harnesses/DelegationManagerHarness.sol \ lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol lib/openzeppelin-contracts/contracts/mocks/ERC1271WalletMock.sol \ diff --git a/certora/scripts/core/verifyStrategyManager.sh b/certora/scripts/core/verifyStrategyManager.sh index 7f3b1c5d2..5695ab785 100644 --- a/certora/scripts/core/verifyStrategyManager.sh +++ b/certora/scripts/core/verifyStrategyManager.sh @@ -3,7 +3,7 @@ then RULE="--rule $2" fi -solc-select use 0.8.12 +solc-select use 0.8.27 certoraRun certora/harnesses/StrategyManagerHarness.sol \ lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol lib/openzeppelin-contracts/contracts/mocks/ERC1271WalletMock.sol \ diff --git a/certora/scripts/libraries/verifyStructuredLinkedList.sh b/certora/scripts/libraries/verifyStructuredLinkedList.sh index c03c593d4..25615e4e0 100644 --- a/certora/scripts/libraries/verifyStructuredLinkedList.sh +++ b/certora/scripts/libraries/verifyStructuredLinkedList.sh @@ -3,7 +3,7 @@ then RULE="--rule $2" fi -solc-select use 0.8.12 +solc-select use 0.8.27 certoraRun certora/harnesses/StructuredLinkedListHarness.sol \ --verify StructuredLinkedListHarness:certora/specs/libraries/StructuredLinkedList.spec \ diff --git a/certora/scripts/permissions/verifyPausable.sh b/certora/scripts/permissions/verifyPausable.sh index c9d23f965..29cc4c1ad 100644 --- a/certora/scripts/permissions/verifyPausable.sh +++ b/certora/scripts/permissions/verifyPausable.sh @@ -3,7 +3,7 @@ then RULE="--rule $2" fi -solc-select use 0.8.12 +solc-select use 0.8.27 certoraRun certora/harnesses/PausableHarness.sol \ src/contracts/permissions/PauserRegistry.sol \ diff --git a/certora/scripts/pods/verifyEigenPod.sh b/certora/scripts/pods/verifyEigenPod.sh index d4bc140a8..e4d7fedb8 100644 --- a/certora/scripts/pods/verifyEigenPod.sh +++ b/certora/scripts/pods/verifyEigenPod.sh @@ -3,7 +3,7 @@ then RULE="--rule $2" fi -# solc-select use 0.8.12 +# solc-select use 0.8.27 # certoraRun certora/harnesses/EigenPodHarness.sol \ # src/contracts/core/DelegationManager.sol src/contracts/pods/EigenPodManager.sol \ diff --git a/certora/scripts/pods/verifyEigenPodManager.sh b/certora/scripts/pods/verifyEigenPodManager.sh index 428f89ba3..9b4a62106 100644 --- a/certora/scripts/pods/verifyEigenPodManager.sh +++ b/certora/scripts/pods/verifyEigenPodManager.sh @@ -3,7 +3,7 @@ then RULE="--rule $2" fi -# solc-select use 0.8.12 +# 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 \ diff --git a/certora/scripts/strategies/verifyStrategyBase.sh b/certora/scripts/strategies/verifyStrategyBase.sh index 5c3d2683f..58514d0dc 100644 --- a/certora/scripts/strategies/verifyStrategyBase.sh +++ b/certora/scripts/strategies/verifyStrategyBase.sh @@ -3,7 +3,7 @@ then RULE="--rule $2" fi -solc-select use 0.8.12 +solc-select use 0.8.27 certoraRun src/contracts/strategies/StrategyBase.sol \ lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol \ diff --git a/docs/storage-report/AVSDirectory.md b/docs/storage-report/AVSDirectory.md index cf36169ac..2abae63dd 100644 --- a/docs/storage-report/AVSDirectory.md +++ b/docs/storage-report/AVSDirectory.md @@ -1,16 +1,21 @@ -| Name | Type | Slot | Offset | Bytes | Contract | -|---------------------|------------------------------------------------------------------------------------------|------|--------|-------|--------------------------------------------------| -| _initialized | uint8 | 0 | 0 | 1 | src/contracts/core/AVSDirectory.sol:AVSDirectory | -| _initializing | bool | 0 | 1 | 1 | src/contracts/core/AVSDirectory.sol:AVSDirectory | -| __gap | uint256[50] | 1 | 0 | 1600 | src/contracts/core/AVSDirectory.sol:AVSDirectory | -| _owner | address | 51 | 0 | 20 | src/contracts/core/AVSDirectory.sol:AVSDirectory | -| __gap | uint256[49] | 52 | 0 | 1568 | src/contracts/core/AVSDirectory.sol:AVSDirectory | -| pauserRegistry | contract IPauserRegistry | 101 | 0 | 20 | src/contracts/core/AVSDirectory.sol:AVSDirectory | -| _paused | uint256 | 102 | 0 | 32 | src/contracts/core/AVSDirectory.sol:AVSDirectory | -| __gap | uint256[48] | 103 | 0 | 1536 | src/contracts/core/AVSDirectory.sol:AVSDirectory | -| _DOMAIN_SEPARATOR | bytes32 | 151 | 0 | 32 | src/contracts/core/AVSDirectory.sol:AVSDirectory | -| avsOperatorStatus | mapping(address => mapping(address => enum IAVSDirectory.OperatorAVSRegistrationStatus)) | 152 | 0 | 32 | src/contracts/core/AVSDirectory.sol:AVSDirectory | -| operatorSaltIsSpent | mapping(address => mapping(bytes32 => bool)) | 153 | 0 | 32 | src/contracts/core/AVSDirectory.sol:AVSDirectory | -| __gap | uint256[47] | 154 | 0 | 1504 | src/contracts/core/AVSDirectory.sol:AVSDirectory | -| _status | uint256 | 201 | 0 | 32 | src/contracts/core/AVSDirectory.sol:AVSDirectory | -| __gap | uint256[49] | 202 | 0 | 1568 | src/contracts/core/AVSDirectory.sol:AVSDirectory | +| Name | Type | Slot | Offset | Bytes | Contract | +|-----------------------|---------------------------------------------------------------------------------------------------------------|------|--------|-------|--------------------------------------------------| +| _initialized | uint8 | 0 | 0 | 1 | src/contracts/core/AVSDirectory.sol:AVSDirectory | +| _initializing | bool | 0 | 1 | 1 | src/contracts/core/AVSDirectory.sol:AVSDirectory | +| __gap | uint256[50] | 1 | 0 | 1600 | src/contracts/core/AVSDirectory.sol:AVSDirectory | +| _owner | address | 51 | 0 | 20 | src/contracts/core/AVSDirectory.sol:AVSDirectory | +| __gap | uint256[49] | 52 | 0 | 1568 | src/contracts/core/AVSDirectory.sol:AVSDirectory | +| pauserRegistry | contract IPauserRegistry | 101 | 0 | 20 | src/contracts/core/AVSDirectory.sol:AVSDirectory | +| _paused | uint256 | 102 | 0 | 32 | src/contracts/core/AVSDirectory.sol:AVSDirectory | +| __gap | uint256[48] | 103 | 0 | 1536 | src/contracts/core/AVSDirectory.sol:AVSDirectory | +| _DOMAIN_SEPARATOR | bytes32 | 151 | 0 | 32 | src/contracts/core/AVSDirectory.sol:AVSDirectory | +| avsOperatorStatus | mapping(address => mapping(address => enum IAVSDirectory.OperatorAVSRegistrationStatus)) | 152 | 0 | 32 | src/contracts/core/AVSDirectory.sol:AVSDirectory | +| operatorSaltIsSpent | mapping(address => mapping(bytes32 => bool)) | 153 | 0 | 32 | src/contracts/core/AVSDirectory.sol:AVSDirectory | +| isOperatorSetAVS | mapping(address => bool) | 154 | 0 | 32 | src/contracts/core/AVSDirectory.sol:AVSDirectory | +| isOperatorSet | mapping(address => mapping(uint32 => bool)) | 155 | 0 | 32 | src/contracts/core/AVSDirectory.sol:AVSDirectory | +| _operatorSetsMemberOf | mapping(address => struct EnumerableSet.Bytes32Set) | 156 | 0 | 32 | src/contracts/core/AVSDirectory.sol:AVSDirectory | +| _operatorSetMembers | mapping(bytes32 => struct EnumerableSet.AddressSet) | 157 | 0 | 32 | src/contracts/core/AVSDirectory.sol:AVSDirectory | +| operatorSetStatus | mapping(address => mapping(address => mapping(uint32 => struct IAVSDirectory.OperatorSetRegistrationStatus))) | 158 | 0 | 32 | src/contracts/core/AVSDirectory.sol:AVSDirectory | +| __gap | uint256[42] | 159 | 0 | 1344 | src/contracts/core/AVSDirectory.sol:AVSDirectory | +| _status | uint256 | 201 | 0 | 32 | src/contracts/core/AVSDirectory.sol:AVSDirectory | +| __gap | uint256[49] | 202 | 0 | 1568 | src/contracts/core/AVSDirectory.sol:AVSDirectory | diff --git a/docs/storage-report/AVSDirectoryStorage.md b/docs/storage-report/AVSDirectoryStorage.md index a337342d0..a35572ea5 100644 --- a/docs/storage-report/AVSDirectoryStorage.md +++ b/docs/storage-report/AVSDirectoryStorage.md @@ -1,6 +1,11 @@ -| Name | Type | Slot | Offset | Bytes | Contract | -|---------------------|------------------------------------------------------------------------------------------|------|--------|-------|----------------------------------------------------------------| -| _DOMAIN_SEPARATOR | bytes32 | 0 | 0 | 32 | src/contracts/core/AVSDirectoryStorage.sol:AVSDirectoryStorage | -| avsOperatorStatus | mapping(address => mapping(address => enum IAVSDirectory.OperatorAVSRegistrationStatus)) | 1 | 0 | 32 | src/contracts/core/AVSDirectoryStorage.sol:AVSDirectoryStorage | -| operatorSaltIsSpent | mapping(address => mapping(bytes32 => bool)) | 2 | 0 | 32 | src/contracts/core/AVSDirectoryStorage.sol:AVSDirectoryStorage | -| __gap | uint256[47] | 3 | 0 | 1504 | src/contracts/core/AVSDirectoryStorage.sol:AVSDirectoryStorage | +| Name | Type | Slot | Offset | Bytes | Contract | +|-----------------------|---------------------------------------------------------------------------------------------------------------|------|--------|-------|----------------------------------------------------------------| +| _DOMAIN_SEPARATOR | bytes32 | 0 | 0 | 32 | src/contracts/core/AVSDirectoryStorage.sol:AVSDirectoryStorage | +| avsOperatorStatus | mapping(address => mapping(address => enum IAVSDirectory.OperatorAVSRegistrationStatus)) | 1 | 0 | 32 | src/contracts/core/AVSDirectoryStorage.sol:AVSDirectoryStorage | +| operatorSaltIsSpent | mapping(address => mapping(bytes32 => bool)) | 2 | 0 | 32 | src/contracts/core/AVSDirectoryStorage.sol:AVSDirectoryStorage | +| isOperatorSetAVS | mapping(address => bool) | 3 | 0 | 32 | src/contracts/core/AVSDirectoryStorage.sol:AVSDirectoryStorage | +| isOperatorSet | mapping(address => mapping(uint32 => bool)) | 4 | 0 | 32 | src/contracts/core/AVSDirectoryStorage.sol:AVSDirectoryStorage | +| _operatorSetsMemberOf | mapping(address => struct EnumerableSet.Bytes32Set) | 5 | 0 | 32 | src/contracts/core/AVSDirectoryStorage.sol:AVSDirectoryStorage | +| _operatorSetMembers | mapping(bytes32 => struct EnumerableSet.AddressSet) | 6 | 0 | 32 | src/contracts/core/AVSDirectoryStorage.sol:AVSDirectoryStorage | +| operatorSetStatus | mapping(address => mapping(address => mapping(uint32 => struct IAVSDirectory.OperatorSetRegistrationStatus))) | 7 | 0 | 32 | src/contracts/core/AVSDirectoryStorage.sol:AVSDirectoryStorage | +| __gap | uint256[42] | 8 | 0 | 1344 | src/contracts/core/AVSDirectoryStorage.sol:AVSDirectoryStorage | diff --git a/docs/storage-report/AllocationManager.md b/docs/storage-report/AllocationManager.md new file mode 100644 index 000000000..d3182dc95 --- /dev/null +++ b/docs/storage-report/AllocationManager.md @@ -0,0 +1,21 @@ +| Name | Type | Slot | Offset | Bytes | Contract | +|----------------------------|-----------------------------------------------------------------------------------------------------|------|--------|-------|------------------------------------------------------------| +| _initialized | uint8 | 0 | 0 | 1 | src/contracts/core/AllocationManager.sol:AllocationManager | +| _initializing | bool | 0 | 1 | 1 | src/contracts/core/AllocationManager.sol:AllocationManager | +| __gap | uint256[50] | 1 | 0 | 1600 | src/contracts/core/AllocationManager.sol:AllocationManager | +| _owner | address | 51 | 0 | 20 | src/contracts/core/AllocationManager.sol:AllocationManager | +| __gap | uint256[49] | 52 | 0 | 1568 | src/contracts/core/AllocationManager.sol:AllocationManager | +| pauserRegistry | contract IPauserRegistry | 101 | 0 | 20 | src/contracts/core/AllocationManager.sol:AllocationManager | +| _paused | uint256 | 102 | 0 | 32 | src/contracts/core/AllocationManager.sol:AllocationManager | +| __gap | uint256[48] | 103 | 0 | 1536 | src/contracts/core/AllocationManager.sol:AllocationManager | +| _DOMAIN_SEPARATOR | bytes32 | 151 | 0 | 32 | src/contracts/core/AllocationManager.sol:AllocationManager | +| operatorSaltIsSpent | mapping(address => mapping(bytes32 => bool)) | 152 | 0 | 32 | src/contracts/core/AllocationManager.sol:AllocationManager | +| _totalMagnitudeUpdate | mapping(address => mapping(contract IStrategy => struct Snapshots.History)) | 153 | 0 | 32 | src/contracts/core/AllocationManager.sol:AllocationManager | +| _magnitudeUpdate | mapping(address => mapping(contract IStrategy => mapping(bytes32 => struct Snapshots.History))) | 154 | 0 | 32 | src/contracts/core/AllocationManager.sol:AllocationManager | +| operatorMagnitudeInfo | mapping(address => mapping(contract IStrategy => struct IAllocationManager.OperatorMagnitudeInfo)) | 155 | 0 | 32 | src/contracts/core/AllocationManager.sol:AllocationManager | +| _pendingFreeMagnitude | mapping(address => mapping(contract IStrategy => struct IAllocationManager.PendingFreeMagnitude[])) | 156 | 0 | 32 | src/contracts/core/AllocationManager.sol:AllocationManager | +| _queuedDeallocationIndices | mapping(address => mapping(contract IStrategy => mapping(bytes32 => uint256[]))) | 157 | 0 | 32 | src/contracts/core/AllocationManager.sol:AllocationManager | +| _allocationDelayInfo | mapping(address => struct IAllocationManager.AllocationDelayInfo) | 158 | 0 | 32 | src/contracts/core/AllocationManager.sol:AllocationManager | +| __gap | uint256[42] | 159 | 0 | 1344 | src/contracts/core/AllocationManager.sol:AllocationManager | +| _status | uint256 | 201 | 0 | 32 | src/contracts/core/AllocationManager.sol:AllocationManager | +| __gap | uint256[49] | 202 | 0 | 1568 | src/contracts/core/AllocationManager.sol:AllocationManager | diff --git a/docs/storage-report/AllocationManagerStorage.md b/docs/storage-report/AllocationManagerStorage.md new file mode 100644 index 000000000..52ad78099 --- /dev/null +++ b/docs/storage-report/AllocationManagerStorage.md @@ -0,0 +1,11 @@ +| Name | Type | Slot | Offset | Bytes | Contract | +|----------------------------|-----------------------------------------------------------------------------------------------------|------|--------|-------|--------------------------------------------------------------------------| +| _DOMAIN_SEPARATOR | bytes32 | 0 | 0 | 32 | src/contracts/core/AllocationManagerStorage.sol:AllocationManagerStorage | +| operatorSaltIsSpent | mapping(address => mapping(bytes32 => bool)) | 1 | 0 | 32 | src/contracts/core/AllocationManagerStorage.sol:AllocationManagerStorage | +| _totalMagnitudeUpdate | mapping(address => mapping(contract IStrategy => struct Snapshots.History)) | 2 | 0 | 32 | src/contracts/core/AllocationManagerStorage.sol:AllocationManagerStorage | +| _magnitudeUpdate | mapping(address => mapping(contract IStrategy => mapping(bytes32 => struct Snapshots.History))) | 3 | 0 | 32 | src/contracts/core/AllocationManagerStorage.sol:AllocationManagerStorage | +| operatorMagnitudeInfo | mapping(address => mapping(contract IStrategy => struct IAllocationManager.OperatorMagnitudeInfo)) | 4 | 0 | 32 | src/contracts/core/AllocationManagerStorage.sol:AllocationManagerStorage | +| _pendingFreeMagnitude | mapping(address => mapping(contract IStrategy => struct IAllocationManager.PendingFreeMagnitude[])) | 5 | 0 | 32 | src/contracts/core/AllocationManagerStorage.sol:AllocationManagerStorage | +| _queuedDeallocationIndices | mapping(address => mapping(contract IStrategy => mapping(bytes32 => uint256[]))) | 6 | 0 | 32 | src/contracts/core/AllocationManagerStorage.sol:AllocationManagerStorage | +| _allocationDelayInfo | mapping(address => struct IAllocationManager.AllocationDelayInfo) | 7 | 0 | 32 | src/contracts/core/AllocationManagerStorage.sol:AllocationManagerStorage | +| __gap | uint256[42] | 8 | 0 | 1344 | src/contracts/core/AllocationManagerStorage.sol:AllocationManagerStorage | diff --git a/docs/storage-report/DelegationManager.md b/docs/storage-report/DelegationManager.md index 61594f32a..c0f76e259 100644 --- a/docs/storage-report/DelegationManager.md +++ b/docs/storage-report/DelegationManager.md @@ -1,24 +1,25 @@ -| Name | Type | Slot | Offset | Bytes | Contract | -|-------------------------------|---------------------------------------------------------------|------|--------|-------|------------------------------------------------------------| -| _initialized | uint8 | 0 | 0 | 1 | src/contracts/core/DelegationManager.sol:DelegationManager | -| _initializing | bool | 0 | 1 | 1 | src/contracts/core/DelegationManager.sol:DelegationManager | -| __gap | uint256[50] | 1 | 0 | 1600 | src/contracts/core/DelegationManager.sol:DelegationManager | -| _owner | address | 51 | 0 | 20 | src/contracts/core/DelegationManager.sol:DelegationManager | -| __gap | uint256[49] | 52 | 0 | 1568 | src/contracts/core/DelegationManager.sol:DelegationManager | -| pauserRegistry | contract IPauserRegistry | 101 | 0 | 20 | src/contracts/core/DelegationManager.sol:DelegationManager | -| _paused | uint256 | 102 | 0 | 32 | src/contracts/core/DelegationManager.sol:DelegationManager | -| __gap | uint256[48] | 103 | 0 | 1536 | src/contracts/core/DelegationManager.sol:DelegationManager | -| _DOMAIN_SEPARATOR | bytes32 | 151 | 0 | 32 | src/contracts/core/DelegationManager.sol:DelegationManager | -| operatorShares | mapping(address => mapping(contract IStrategy => uint256)) | 152 | 0 | 32 | src/contracts/core/DelegationManager.sol:DelegationManager | -| _operatorDetails | mapping(address => struct IDelegationManager.OperatorDetails) | 153 | 0 | 32 | src/contracts/core/DelegationManager.sol:DelegationManager | -| delegatedTo | mapping(address => address) | 154 | 0 | 32 | src/contracts/core/DelegationManager.sol:DelegationManager | -| stakerNonce | mapping(address => uint256) | 155 | 0 | 32 | src/contracts/core/DelegationManager.sol:DelegationManager | -| delegationApproverSaltIsSpent | mapping(address => mapping(bytes32 => bool)) | 156 | 0 | 32 | src/contracts/core/DelegationManager.sol:DelegationManager | -| minWithdrawalDelayBlocks | uint256 | 157 | 0 | 32 | src/contracts/core/DelegationManager.sol:DelegationManager | -| pendingWithdrawals | mapping(bytes32 => bool) | 158 | 0 | 32 | src/contracts/core/DelegationManager.sol:DelegationManager | -| cumulativeWithdrawalsQueued | mapping(address => uint256) | 159 | 0 | 32 | src/contracts/core/DelegationManager.sol:DelegationManager | -| __deprecated_stakeRegistry | address | 160 | 0 | 20 | src/contracts/core/DelegationManager.sol:DelegationManager | -| strategyWithdrawalDelayBlocks | mapping(contract IStrategy => uint256) | 161 | 0 | 32 | src/contracts/core/DelegationManager.sol:DelegationManager | -| __gap | uint256[39] | 162 | 0 | 1248 | src/contracts/core/DelegationManager.sol:DelegationManager | -| _status | uint256 | 201 | 0 | 32 | src/contracts/core/DelegationManager.sol:DelegationManager | -| __gap | uint256[49] | 202 | 0 | 1568 | src/contracts/core/DelegationManager.sol:DelegationManager | +| Name | Type | Slot | Offset | Bytes | Contract | +|--------------------------------------------|---------------------------------------------------------------|------|--------|-------|------------------------------------------------------------| +| _initialized | uint8 | 0 | 0 | 1 | src/contracts/core/DelegationManager.sol:DelegationManager | +| _initializing | bool | 0 | 1 | 1 | src/contracts/core/DelegationManager.sol:DelegationManager | +| __gap | uint256[50] | 1 | 0 | 1600 | src/contracts/core/DelegationManager.sol:DelegationManager | +| _owner | address | 51 | 0 | 20 | src/contracts/core/DelegationManager.sol:DelegationManager | +| __gap | uint256[49] | 52 | 0 | 1568 | src/contracts/core/DelegationManager.sol:DelegationManager | +| pauserRegistry | contract IPauserRegistry | 101 | 0 | 20 | src/contracts/core/DelegationManager.sol:DelegationManager | +| _paused | uint256 | 102 | 0 | 32 | src/contracts/core/DelegationManager.sol:DelegationManager | +| __gap | uint256[48] | 103 | 0 | 1536 | src/contracts/core/DelegationManager.sol:DelegationManager | +| _DOMAIN_SEPARATOR | bytes32 | 151 | 0 | 32 | src/contracts/core/DelegationManager.sol:DelegationManager | +| operatorScaledShares | mapping(address => mapping(contract IStrategy => uint256)) | 152 | 0 | 32 | src/contracts/core/DelegationManager.sol:DelegationManager | +| _operatorDetails | mapping(address => struct IDelegationManager.OperatorDetails) | 153 | 0 | 32 | src/contracts/core/DelegationManager.sol:DelegationManager | +| delegatedTo | mapping(address => address) | 154 | 0 | 32 | src/contracts/core/DelegationManager.sol:DelegationManager | +| stakerNonce | mapping(address => uint256) | 155 | 0 | 32 | src/contracts/core/DelegationManager.sol:DelegationManager | +| delegationApproverSaltIsSpent | mapping(address => mapping(bytes32 => bool)) | 156 | 0 | 32 | src/contracts/core/DelegationManager.sol:DelegationManager | +| __deprecated_minWithdrawalDelayBlocks | uint256 | 157 | 0 | 32 | src/contracts/core/DelegationManager.sol:DelegationManager | +| pendingWithdrawals | mapping(bytes32 => bool) | 158 | 0 | 32 | src/contracts/core/DelegationManager.sol:DelegationManager | +| cumulativeWithdrawalsQueued | mapping(address => uint256) | 159 | 0 | 32 | src/contracts/core/DelegationManager.sol:DelegationManager | +| __deprecated_stakeRegistry | address | 160 | 0 | 20 | src/contracts/core/DelegationManager.sol:DelegationManager | +| __deprecated_strategyWithdrawalDelayBlocks | mapping(contract IStrategy => uint256) | 161 | 0 | 32 | src/contracts/core/DelegationManager.sol:DelegationManager | +| stakerScalingFactors | mapping(address => mapping(contract IStrategy => uint256)) | 162 | 0 | 32 | src/contracts/core/DelegationManager.sol:DelegationManager | +| __gap | uint256[38] | 163 | 0 | 1216 | src/contracts/core/DelegationManager.sol:DelegationManager | +| _status | uint256 | 201 | 0 | 32 | src/contracts/core/DelegationManager.sol:DelegationManager | +| __gap | uint256[49] | 202 | 0 | 1568 | src/contracts/core/DelegationManager.sol:DelegationManager | diff --git a/docs/storage-report/DelegationManagerStorage.md b/docs/storage-report/DelegationManagerStorage.md index 2ae1eb04b..6f31d6c99 100644 --- a/docs/storage-report/DelegationManagerStorage.md +++ b/docs/storage-report/DelegationManagerStorage.md @@ -1,14 +1,15 @@ -| Name | Type | Slot | Offset | Bytes | Contract | -|-------------------------------|---------------------------------------------------------------|------|--------|-------|--------------------------------------------------------------------------| -| _DOMAIN_SEPARATOR | bytes32 | 0 | 0 | 32 | src/contracts/core/DelegationManagerStorage.sol:DelegationManagerStorage | -| operatorShares | mapping(address => mapping(contract IStrategy => uint256)) | 1 | 0 | 32 | src/contracts/core/DelegationManagerStorage.sol:DelegationManagerStorage | -| _operatorDetails | mapping(address => struct IDelegationManager.OperatorDetails) | 2 | 0 | 32 | src/contracts/core/DelegationManagerStorage.sol:DelegationManagerStorage | -| delegatedTo | mapping(address => address) | 3 | 0 | 32 | src/contracts/core/DelegationManagerStorage.sol:DelegationManagerStorage | -| stakerNonce | mapping(address => uint256) | 4 | 0 | 32 | src/contracts/core/DelegationManagerStorage.sol:DelegationManagerStorage | -| delegationApproverSaltIsSpent | mapping(address => mapping(bytes32 => bool)) | 5 | 0 | 32 | src/contracts/core/DelegationManagerStorage.sol:DelegationManagerStorage | -| minWithdrawalDelayBlocks | uint256 | 6 | 0 | 32 | src/contracts/core/DelegationManagerStorage.sol:DelegationManagerStorage | -| pendingWithdrawals | mapping(bytes32 => bool) | 7 | 0 | 32 | src/contracts/core/DelegationManagerStorage.sol:DelegationManagerStorage | -| cumulativeWithdrawalsQueued | mapping(address => uint256) | 8 | 0 | 32 | src/contracts/core/DelegationManagerStorage.sol:DelegationManagerStorage | -| __deprecated_stakeRegistry | address | 9 | 0 | 20 | src/contracts/core/DelegationManagerStorage.sol:DelegationManagerStorage | -| strategyWithdrawalDelayBlocks | mapping(contract IStrategy => uint256) | 10 | 0 | 32 | src/contracts/core/DelegationManagerStorage.sol:DelegationManagerStorage | -| __gap | uint256[39] | 11 | 0 | 1248 | src/contracts/core/DelegationManagerStorage.sol:DelegationManagerStorage | +| Name | Type | Slot | Offset | Bytes | Contract | +|--------------------------------------------|---------------------------------------------------------------|------|--------|-------|--------------------------------------------------------------------------| +| _DOMAIN_SEPARATOR | bytes32 | 0 | 0 | 32 | src/contracts/core/DelegationManagerStorage.sol:DelegationManagerStorage | +| operatorScaledShares | mapping(address => mapping(contract IStrategy => uint256)) | 1 | 0 | 32 | src/contracts/core/DelegationManagerStorage.sol:DelegationManagerStorage | +| _operatorDetails | mapping(address => struct IDelegationManager.OperatorDetails) | 2 | 0 | 32 | src/contracts/core/DelegationManagerStorage.sol:DelegationManagerStorage | +| delegatedTo | mapping(address => address) | 3 | 0 | 32 | src/contracts/core/DelegationManagerStorage.sol:DelegationManagerStorage | +| stakerNonce | mapping(address => uint256) | 4 | 0 | 32 | src/contracts/core/DelegationManagerStorage.sol:DelegationManagerStorage | +| delegationApproverSaltIsSpent | mapping(address => mapping(bytes32 => bool)) | 5 | 0 | 32 | src/contracts/core/DelegationManagerStorage.sol:DelegationManagerStorage | +| __deprecated_minWithdrawalDelayBlocks | uint256 | 6 | 0 | 32 | src/contracts/core/DelegationManagerStorage.sol:DelegationManagerStorage | +| pendingWithdrawals | mapping(bytes32 => bool) | 7 | 0 | 32 | src/contracts/core/DelegationManagerStorage.sol:DelegationManagerStorage | +| cumulativeWithdrawalsQueued | mapping(address => uint256) | 8 | 0 | 32 | src/contracts/core/DelegationManagerStorage.sol:DelegationManagerStorage | +| __deprecated_stakeRegistry | address | 9 | 0 | 20 | src/contracts/core/DelegationManagerStorage.sol:DelegationManagerStorage | +| __deprecated_strategyWithdrawalDelayBlocks | mapping(contract IStrategy => uint256) | 10 | 0 | 32 | src/contracts/core/DelegationManagerStorage.sol:DelegationManagerStorage | +| stakerScalingFactors | mapping(address => mapping(contract IStrategy => uint256)) | 11 | 0 | 32 | src/contracts/core/DelegationManagerStorage.sol:DelegationManagerStorage | +| __gap | uint256[38] | 12 | 0 | 1216 | src/contracts/core/DelegationManagerStorage.sol:DelegationManagerStorage | diff --git a/docs/storage-report/RewardsCoordinator.md b/docs/storage-report/RewardsCoordinator.md index c3ac38649..726906890 100644 --- a/docs/storage-report/RewardsCoordinator.md +++ b/docs/storage-report/RewardsCoordinator.md @@ -1,26 +1,28 @@ -| Name | Type | Slot | Offset | Bytes | Contract | -|--------------------------------------|---------------------------------------------------------|------|--------|-------|--------------------------------------------------------------| -| _initialized | uint8 | 0 | 0 | 1 | src/contracts/core/RewardsCoordinator.sol:RewardsCoordinator | -| _initializing | bool | 0 | 1 | 1 | src/contracts/core/RewardsCoordinator.sol:RewardsCoordinator | -| __gap | uint256[50] | 1 | 0 | 1600 | src/contracts/core/RewardsCoordinator.sol:RewardsCoordinator | -| _owner | address | 51 | 0 | 20 | src/contracts/core/RewardsCoordinator.sol:RewardsCoordinator | -| __gap | uint256[49] | 52 | 0 | 1568 | src/contracts/core/RewardsCoordinator.sol:RewardsCoordinator | -| pauserRegistry | contract IPauserRegistry | 101 | 0 | 20 | src/contracts/core/RewardsCoordinator.sol:RewardsCoordinator | -| _paused | uint256 | 102 | 0 | 32 | src/contracts/core/RewardsCoordinator.sol:RewardsCoordinator | -| __gap | uint256[48] | 103 | 0 | 1536 | src/contracts/core/RewardsCoordinator.sol:RewardsCoordinator | -| _status | uint256 | 151 | 0 | 32 | src/contracts/core/RewardsCoordinator.sol:RewardsCoordinator | -| __gap | uint256[49] | 152 | 0 | 1568 | src/contracts/core/RewardsCoordinator.sol:RewardsCoordinator | -| _DOMAIN_SEPARATOR | bytes32 | 201 | 0 | 32 | src/contracts/core/RewardsCoordinator.sol:RewardsCoordinator | -| _distributionRoots | struct IRewardsCoordinator.DistributionRoot[] | 202 | 0 | 32 | src/contracts/core/RewardsCoordinator.sol:RewardsCoordinator | -| rewardsUpdater | address | 203 | 0 | 20 | src/contracts/core/RewardsCoordinator.sol:RewardsCoordinator | -| activationDelay | uint32 | 203 | 20 | 4 | src/contracts/core/RewardsCoordinator.sol:RewardsCoordinator | -| currRewardsCalculationEndTimestamp | uint32 | 203 | 24 | 4 | src/contracts/core/RewardsCoordinator.sol:RewardsCoordinator | -| globalOperatorCommissionBips | uint16 | 203 | 28 | 2 | src/contracts/core/RewardsCoordinator.sol:RewardsCoordinator | -| claimerFor | mapping(address => address) | 204 | 0 | 32 | src/contracts/core/RewardsCoordinator.sol:RewardsCoordinator | -| cumulativeClaimed | mapping(address => mapping(contract IERC20 => uint256)) | 205 | 0 | 32 | src/contracts/core/RewardsCoordinator.sol:RewardsCoordinator | -| submissionNonce | mapping(address => uint256) | 206 | 0 | 32 | src/contracts/core/RewardsCoordinator.sol:RewardsCoordinator | -| isAVSRewardsSubmissionHash | mapping(address => mapping(bytes32 => bool)) | 207 | 0 | 32 | src/contracts/core/RewardsCoordinator.sol:RewardsCoordinator | -| isRewardsSubmissionForAllHash | mapping(address => mapping(bytes32 => bool)) | 208 | 0 | 32 | src/contracts/core/RewardsCoordinator.sol:RewardsCoordinator | -| isRewardsForAllSubmitter | mapping(address => bool) | 209 | 0 | 32 | src/contracts/core/RewardsCoordinator.sol:RewardsCoordinator | -| isRewardsSubmissionForAllEarnersHash | mapping(address => mapping(bytes32 => bool)) | 210 | 0 | 32 | src/contracts/core/RewardsCoordinator.sol:RewardsCoordinator | -| __gap | uint256[39] | 211 | 0 | 1248 | src/contracts/core/RewardsCoordinator.sol:RewardsCoordinator | +| Name | Type | Slot | Offset | Bytes | Contract | +|--------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------|------|--------|-------|--------------------------------------------------------------| +| _initialized | uint8 | 0 | 0 | 1 | src/contracts/core/RewardsCoordinator.sol:RewardsCoordinator | +| _initializing | bool | 0 | 1 | 1 | src/contracts/core/RewardsCoordinator.sol:RewardsCoordinator | +| __gap | uint256[50] | 1 | 0 | 1600 | src/contracts/core/RewardsCoordinator.sol:RewardsCoordinator | +| _owner | address | 51 | 0 | 20 | src/contracts/core/RewardsCoordinator.sol:RewardsCoordinator | +| __gap | uint256[49] | 52 | 0 | 1568 | src/contracts/core/RewardsCoordinator.sol:RewardsCoordinator | +| pauserRegistry | contract IPauserRegistry | 101 | 0 | 20 | src/contracts/core/RewardsCoordinator.sol:RewardsCoordinator | +| _paused | uint256 | 102 | 0 | 32 | src/contracts/core/RewardsCoordinator.sol:RewardsCoordinator | +| __gap | uint256[48] | 103 | 0 | 1536 | src/contracts/core/RewardsCoordinator.sol:RewardsCoordinator | +| _status | uint256 | 151 | 0 | 32 | src/contracts/core/RewardsCoordinator.sol:RewardsCoordinator | +| __gap | uint256[49] | 152 | 0 | 1568 | src/contracts/core/RewardsCoordinator.sol:RewardsCoordinator | +| _DOMAIN_SEPARATOR | bytes32 | 201 | 0 | 32 | src/contracts/core/RewardsCoordinator.sol:RewardsCoordinator | +| _distributionRoots | struct IRewardsCoordinator.DistributionRoot[] | 202 | 0 | 32 | src/contracts/core/RewardsCoordinator.sol:RewardsCoordinator | +| rewardsUpdater | address | 203 | 0 | 20 | src/contracts/core/RewardsCoordinator.sol:RewardsCoordinator | +| activationDelay | uint32 | 203 | 20 | 4 | src/contracts/core/RewardsCoordinator.sol:RewardsCoordinator | +| currRewardsCalculationEndTimestamp | uint32 | 203 | 24 | 4 | src/contracts/core/RewardsCoordinator.sol:RewardsCoordinator | +| globalOperatorCommissionBips | uint16 | 203 | 28 | 2 | src/contracts/core/RewardsCoordinator.sol:RewardsCoordinator | +| claimerFor | mapping(address => address) | 204 | 0 | 32 | src/contracts/core/RewardsCoordinator.sol:RewardsCoordinator | +| cumulativeClaimed | mapping(address => mapping(contract IERC20 => uint256)) | 205 | 0 | 32 | src/contracts/core/RewardsCoordinator.sol:RewardsCoordinator | +| submissionNonce | mapping(address => uint256) | 206 | 0 | 32 | src/contracts/core/RewardsCoordinator.sol:RewardsCoordinator | +| isAVSRewardsSubmissionHash | mapping(address => mapping(bytes32 => bool)) | 207 | 0 | 32 | src/contracts/core/RewardsCoordinator.sol:RewardsCoordinator | +| isRewardsSubmissionForAllHash | mapping(address => mapping(bytes32 => bool)) | 208 | 0 | 32 | src/contracts/core/RewardsCoordinator.sol:RewardsCoordinator | +| isRewardsForAllSubmitter | mapping(address => bool) | 209 | 0 | 32 | src/contracts/core/RewardsCoordinator.sol:RewardsCoordinator | +| isRewardsSubmissionForAllEarnersHash | mapping(address => mapping(bytes32 => bool)) | 210 | 0 | 32 | src/contracts/core/RewardsCoordinator.sol:RewardsCoordinator | +| isOperatorSetRewardsSubmissionHash | mapping(address => mapping(bytes32 => bool)) | 211 | 0 | 32 | src/contracts/core/RewardsCoordinator.sol:RewardsCoordinator | +| operatorCommissionUpdates | mapping(address => mapping(address => mapping(uint32 => mapping(enum IRewardsCoordinator.RewardType => struct IRewardsCoordinator.OperatorCommissionUpdate[])))) | 212 | 0 | 32 | src/contracts/core/RewardsCoordinator.sol:RewardsCoordinator | +| __gap | uint256[37] | 213 | 0 | 1184 | src/contracts/core/RewardsCoordinator.sol:RewardsCoordinator | diff --git a/docs/storage-report/RewardsCoordinatorStorage.md b/docs/storage-report/RewardsCoordinatorStorage.md index e5f8f26bc..36571b647 100644 --- a/docs/storage-report/RewardsCoordinatorStorage.md +++ b/docs/storage-report/RewardsCoordinatorStorage.md @@ -1,16 +1,18 @@ -| Name | Type | Slot | Offset | Bytes | Contract | -|--------------------------------------|---------------------------------------------------------|------|--------|-------|----------------------------------------------------------------------------| -| _DOMAIN_SEPARATOR | bytes32 | 0 | 0 | 32 | src/contracts/core/RewardsCoordinatorStorage.sol:RewardsCoordinatorStorage | -| _distributionRoots | struct IRewardsCoordinator.DistributionRoot[] | 1 | 0 | 32 | src/contracts/core/RewardsCoordinatorStorage.sol:RewardsCoordinatorStorage | -| rewardsUpdater | address | 2 | 0 | 20 | src/contracts/core/RewardsCoordinatorStorage.sol:RewardsCoordinatorStorage | -| activationDelay | uint32 | 2 | 20 | 4 | src/contracts/core/RewardsCoordinatorStorage.sol:RewardsCoordinatorStorage | -| currRewardsCalculationEndTimestamp | uint32 | 2 | 24 | 4 | src/contracts/core/RewardsCoordinatorStorage.sol:RewardsCoordinatorStorage | -| globalOperatorCommissionBips | uint16 | 2 | 28 | 2 | src/contracts/core/RewardsCoordinatorStorage.sol:RewardsCoordinatorStorage | -| claimerFor | mapping(address => address) | 3 | 0 | 32 | src/contracts/core/RewardsCoordinatorStorage.sol:RewardsCoordinatorStorage | -| cumulativeClaimed | mapping(address => mapping(contract IERC20 => uint256)) | 4 | 0 | 32 | src/contracts/core/RewardsCoordinatorStorage.sol:RewardsCoordinatorStorage | -| submissionNonce | mapping(address => uint256) | 5 | 0 | 32 | src/contracts/core/RewardsCoordinatorStorage.sol:RewardsCoordinatorStorage | -| isAVSRewardsSubmissionHash | mapping(address => mapping(bytes32 => bool)) | 6 | 0 | 32 | src/contracts/core/RewardsCoordinatorStorage.sol:RewardsCoordinatorStorage | -| isRewardsSubmissionForAllHash | mapping(address => mapping(bytes32 => bool)) | 7 | 0 | 32 | src/contracts/core/RewardsCoordinatorStorage.sol:RewardsCoordinatorStorage | -| isRewardsForAllSubmitter | mapping(address => bool) | 8 | 0 | 32 | src/contracts/core/RewardsCoordinatorStorage.sol:RewardsCoordinatorStorage | -| isRewardsSubmissionForAllEarnersHash | mapping(address => mapping(bytes32 => bool)) | 9 | 0 | 32 | src/contracts/core/RewardsCoordinatorStorage.sol:RewardsCoordinatorStorage | -| __gap | uint256[39] | 10 | 0 | 1248 | src/contracts/core/RewardsCoordinatorStorage.sol:RewardsCoordinatorStorage | +| Name | Type | Slot | Offset | Bytes | Contract | +|--------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------|------|--------|-------|----------------------------------------------------------------------------| +| _DOMAIN_SEPARATOR | bytes32 | 0 | 0 | 32 | src/contracts/core/RewardsCoordinatorStorage.sol:RewardsCoordinatorStorage | +| _distributionRoots | struct IRewardsCoordinator.DistributionRoot[] | 1 | 0 | 32 | src/contracts/core/RewardsCoordinatorStorage.sol:RewardsCoordinatorStorage | +| rewardsUpdater | address | 2 | 0 | 20 | src/contracts/core/RewardsCoordinatorStorage.sol:RewardsCoordinatorStorage | +| activationDelay | uint32 | 2 | 20 | 4 | src/contracts/core/RewardsCoordinatorStorage.sol:RewardsCoordinatorStorage | +| currRewardsCalculationEndTimestamp | uint32 | 2 | 24 | 4 | src/contracts/core/RewardsCoordinatorStorage.sol:RewardsCoordinatorStorage | +| globalOperatorCommissionBips | uint16 | 2 | 28 | 2 | src/contracts/core/RewardsCoordinatorStorage.sol:RewardsCoordinatorStorage | +| claimerFor | mapping(address => address) | 3 | 0 | 32 | src/contracts/core/RewardsCoordinatorStorage.sol:RewardsCoordinatorStorage | +| cumulativeClaimed | mapping(address => mapping(contract IERC20 => uint256)) | 4 | 0 | 32 | src/contracts/core/RewardsCoordinatorStorage.sol:RewardsCoordinatorStorage | +| submissionNonce | mapping(address => uint256) | 5 | 0 | 32 | src/contracts/core/RewardsCoordinatorStorage.sol:RewardsCoordinatorStorage | +| isAVSRewardsSubmissionHash | mapping(address => mapping(bytes32 => bool)) | 6 | 0 | 32 | src/contracts/core/RewardsCoordinatorStorage.sol:RewardsCoordinatorStorage | +| isRewardsSubmissionForAllHash | mapping(address => mapping(bytes32 => bool)) | 7 | 0 | 32 | src/contracts/core/RewardsCoordinatorStorage.sol:RewardsCoordinatorStorage | +| isRewardsForAllSubmitter | mapping(address => bool) | 8 | 0 | 32 | src/contracts/core/RewardsCoordinatorStorage.sol:RewardsCoordinatorStorage | +| isRewardsSubmissionForAllEarnersHash | mapping(address => mapping(bytes32 => bool)) | 9 | 0 | 32 | src/contracts/core/RewardsCoordinatorStorage.sol:RewardsCoordinatorStorage | +| isOperatorSetRewardsSubmissionHash | mapping(address => mapping(bytes32 => bool)) | 10 | 0 | 32 | src/contracts/core/RewardsCoordinatorStorage.sol:RewardsCoordinatorStorage | +| operatorCommissionUpdates | mapping(address => mapping(address => mapping(uint32 => mapping(enum IRewardsCoordinator.RewardType => struct IRewardsCoordinator.OperatorCommissionUpdate[])))) | 11 | 0 | 32 | src/contracts/core/RewardsCoordinatorStorage.sol:RewardsCoordinatorStorage | +| __gap | uint256[37] | 12 | 0 | 1184 | src/contracts/core/RewardsCoordinatorStorage.sol:RewardsCoordinatorStorage | diff --git a/docs/storage-report/StrategyManager.md b/docs/storage-report/StrategyManager.md index 8f7e5cb4b..2a489f6cb 100644 --- a/docs/storage-report/StrategyManager.md +++ b/docs/storage-report/StrategyManager.md @@ -20,5 +20,5 @@ | __deprecated_numWithdrawalsQueued | mapping(address => uint256) | 208 | 0 | 32 | src/contracts/core/StrategyManager.sol:StrategyManager | | strategyIsWhitelistedForDeposit | mapping(contract IStrategy => bool) | 209 | 0 | 32 | src/contracts/core/StrategyManager.sol:StrategyManager | | beaconChainETHSharesToDecrementOnWithdrawal | mapping(address => uint256) | 210 | 0 | 32 | src/contracts/core/StrategyManager.sol:StrategyManager | -| thirdPartyTransfersForbidden | mapping(contract IStrategy => bool) | 211 | 0 | 32 | src/contracts/core/StrategyManager.sol:StrategyManager | +| __deprecated_thirdPartyTransfersForbidden | mapping(contract IStrategy => bool) | 211 | 0 | 32 | src/contracts/core/StrategyManager.sol:StrategyManager | | __gap | uint256[39] | 212 | 0 | 1248 | src/contracts/core/StrategyManager.sol:StrategyManager | diff --git a/docs/storage-report/StrategyManagerStorage.md b/docs/storage-report/StrategyManagerStorage.md index 701045da7..d5668278d 100644 --- a/docs/storage-report/StrategyManagerStorage.md +++ b/docs/storage-report/StrategyManagerStorage.md @@ -10,5 +10,5 @@ | __deprecated_numWithdrawalsQueued | mapping(address => uint256) | 7 | 0 | 32 | src/contracts/core/StrategyManagerStorage.sol:StrategyManagerStorage | | strategyIsWhitelistedForDeposit | mapping(contract IStrategy => bool) | 8 | 0 | 32 | src/contracts/core/StrategyManagerStorage.sol:StrategyManagerStorage | | beaconChainETHSharesToDecrementOnWithdrawal | mapping(address => uint256) | 9 | 0 | 32 | src/contracts/core/StrategyManagerStorage.sol:StrategyManagerStorage | -| thirdPartyTransfersForbidden | mapping(contract IStrategy => bool) | 10 | 0 | 32 | src/contracts/core/StrategyManagerStorage.sol:StrategyManagerStorage | +| __deprecated_thirdPartyTransfersForbidden | mapping(contract IStrategy => bool) | 10 | 0 | 32 | src/contracts/core/StrategyManagerStorage.sol:StrategyManagerStorage | | __gap | uint256[39] | 11 | 0 | 1248 | src/contracts/core/StrategyManagerStorage.sol:StrategyManagerStorage | diff --git a/foundry.toml b/foundry.toml index 8a79acefa..10126ce27 100644 --- a/foundry.toml +++ b/foundry.toml @@ -16,7 +16,7 @@ optimizer_runs = 200 # Whether or not to use the Yul intermediate representation compilation pipeline via_ir = false # Override the Solidity version (this overrides `auto_detect_solc`) -solc_version = '0.8.12' +solc_version = '0.8.27' [rpc_endpoints] mainnet = "${RPC_MAINNET}" diff --git a/pkg/bindings/AVSDirectory/binding.go b/pkg/bindings/AVSDirectory/binding.go index e91d51eb1..308d6a764 100644 --- a/pkg/bindings/AVSDirectory/binding.go +++ b/pkg/bindings/AVSDirectory/binding.go @@ -38,8 +38,8 @@ type ISignatureUtilsSignatureWithSaltAndExpiry struct { // AVSDirectoryMetaData contains all meta data concerning the AVSDirectory contract. var AVSDirectoryMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_delegation\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"DOMAIN_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"OPERATOR_AVS_REGISTRATION_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"avsOperatorStatus\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumIAVSDirectory.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\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"initialPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"operatorSaltIsSpent\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"registerOperatorToAVS\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSignature\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtils.SignatureWithSaltAndExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setPauserRegistry\",\"inputs\":[{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateAVSMetadataURI\",\"inputs\":[{\"name\":\"metadataURI\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AVSMetadataURIUpdated\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorAVSRegistrationStatusUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"status\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"enumIAVSDirectory.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\":\"PauserRegistrySet\",\"inputs\":[{\"name\":\"pauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"}],\"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}]", - Bin: "0x60c06040523480156200001157600080fd5b5060405162001f7838038062001f78833981016040819052620000349162000118565b6001600160a01b0381166080526200004b62000056565b504660a0526200014a565b600054610100900460ff1615620000c35760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101562000116576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6000602082840312156200012b57600080fd5b81516001600160a01b03811681146200014357600080fd5b9392505050565b60805160a051611e01620001776000396000610ea801526000818161032401526109830152611e016000f3fe608060405234801561001057600080fd5b50600436106101425760003560e01c80638da5cb5b116100b8578063d79aceab1161007c578063d79aceab146102f8578063df5cf7231461031f578063ec76f44214610346578063f2fde38b14610359578063f698da251461036c578063fabc1cbc1461037457600080fd5b80638da5cb5b1461029b5780639926ee7d146102ac578063a1060c88146102bf578063a364f4da146102d2578063a98fb355146102e557600080fd5b806349075da31161010a57806349075da3146101fa578063595c6a67146102355780635ac86ab71461023d5780635c975abb14610260578063715018a614610268578063886f11951461027057600080fd5b806310d67a2f14610147578063136439dd1461015c5780631794bb3c1461016f57806320606b7014610182578063374823b5146101bc575b600080fd5b61015a6101553660046118ab565b610387565b005b61015a61016a3660046118cf565b610443565b61015a61017d3660046118e8565b610582565b6101a97f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b6040519081526020015b60405180910390f35b6101ea6101ca366004611929565b609960209081526000928352604080842090915290825290205460ff1681565b60405190151581526020016101b3565b610228610208366004611955565b609860209081526000928352604080842090915290825290205460ff1681565b6040516101b391906119a4565b61015a6106ac565b6101ea61024b3660046119cc565b606654600160ff9092169190911b9081161490565b6066546101a9565b61015a610773565b606554610283906001600160a01b031681565b6040516001600160a01b0390911681526020016101b3565b6033546001600160a01b0316610283565b61015a6102ba366004611a5f565b610787565b6101a96102cd366004611b46565b610b1a565b61015a6102e03660046118ab565b610bd3565b61015a6102f3366004611b8c565b610d3c565b6101a97fda2c89bafdd34776a2b8bb9c83c82f419e20cc8c67207f70edd58249b92661bd81565b6102837f000000000000000000000000000000000000000000000000000000000000000081565b61015a6103543660046118cf565b610d83565b61015a6103673660046118ab565b610e2e565b6101a9610ea4565b61015a6103823660046118cf565b610ee2565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156103da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103fe9190611bfe565b6001600160a01b0316336001600160a01b0316146104375760405162461bcd60e51b815260040161042e90611c1b565b60405180910390fd5b6104408161103e565b50565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa15801561048b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104af9190611c65565b6104cb5760405162461bcd60e51b815260040161042e90611c87565b606654818116146105445760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c6974790000000000000000606482015260840161042e565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b600054610100900460ff16158080156105a25750600054600160ff909116105b806105bc5750303b1580156105bc575060005460ff166001145b61061f5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840161042e565b6000805460ff191660011790558015610642576000805461ff0019166101001790555b61064c8383611135565b61065461121f565b609755610660846112b6565b80156106a6576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa1580156106f4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107189190611c65565b6107345760405162461bcd60e51b815260040161042e90611c87565b600019606681905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b61077b611308565b61078560006112b6565b565b606654600090600190811614156107dc5760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b604482015260640161042e565b42826040015110156108445760405162461bcd60e51b815260206004820152603e6024820152600080516020611dac83398151915260448201527f56533a206f70657261746f72207369676e617475726520657870697265640000606482015260840161042e565b60013360009081526098602090815260408083206001600160a01b038816845290915290205460ff16600181111561087e5761087e61198e565b14156108e05760405162461bcd60e51b815260206004820152603f6024820152600080516020611dac83398151915260448201527f56533a206f70657261746f7220616c7265616479207265676973746572656400606482015260840161042e565b6001600160a01b038316600090815260996020908152604080832085830151845290915290205460ff16156109645760405162461bcd60e51b81526020600482015260366024820152600080516020611dac8339815191526044820152751594ce881cd85b1d08185b1c9958591e481cdc195b9d60521b606482015260840161042e565b6040516336b87bd760e11b81526001600160a01b0384811660048301527f00000000000000000000000000000000000000000000000000000000000000001690636d70f7ae90602401602060405180830381865afa1580156109ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109ee9190611c65565b610a645760405162461bcd60e51b815260206004820152604d6024820152600080516020611dac83398151915260448201527f56533a206f70657261746f72206e6f74207265676973746572656420746f204560648201526c1a59d95b93185e595c881e595d609a1b608482015260a40161042e565b6000610a7a843385602001518660400151610b1a565b9050610a8b84828560000151611362565b3360008181526098602090815260408083206001600160a01b0389168085529083528184208054600160ff199182168117909255609985528386208a860151875290945293829020805490931684179092555190917ff0952b1c65271d819d39983d2abb044b9cace59bcc4d4dd389f586ebdcb15b4191610b0c91906119a4565b60405180910390a350505050565b604080517fda2c89bafdd34776a2b8bb9c83c82f419e20cc8c67207f70edd58249b92661bd6020808301919091526001600160a01b0387811683850152861660608301526080820185905260a08083018590528351808403909101815260c0909201909252805191012060009081610b90610ea4565b60405161190160f01b602082015260228101919091526042810183905260620160408051808303601f190181529190528051602090910120979650505050505050565b60665460009060019081161415610c285760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b604482015260640161042e565b60013360009081526098602090815260408083206001600160a01b038716845290915290205460ff166001811115610c6257610c6261198e565b14610cd55760405162461bcd60e51b815260206004820152603f60248201527f4156534469726563746f72792e646572656769737465724f70657261746f724660448201527f726f6d4156533a206f70657261746f72206e6f74207265676973746572656400606482015260840161042e565b3360008181526098602090815260408083206001600160a01b0387168085529252808320805460ff191690555190917ff0952b1c65271d819d39983d2abb044b9cace59bcc4d4dd389f586ebdcb15b4191610d3091906119a4565b60405180910390a35050565b336001600160a01b03167fa89c1dc243d8908a96dd84944bcc97d6bc6ac00dd78e20621576be6a3c9437138383604051610d77929190611ccf565b60405180910390a25050565b33600090815260996020908152604080832084845290915290205460ff1615610e085760405162461bcd60e51b815260206004820152603160248201527f4156534469726563746f72792e63616e63656c53616c743a2063616e6e6f742060448201527018d85b98d95b081cdc195b9d081cd85b1d607a1b606482015260840161042e565b33600090815260996020908152604080832093835292905220805460ff19166001179055565b610e36611308565b6001600160a01b038116610e9b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161042e565b610440816112b6565b60007f0000000000000000000000000000000000000000000000000000000000000000461415610ed5575060975490565b610edd61121f565b905090565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f35573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f599190611bfe565b6001600160a01b0316336001600160a01b031614610f895760405162461bcd60e51b815260040161042e90611c1b565b6066541981196066541916146110075760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c6974790000000000000000606482015260840161042e565b606681905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c90602001610577565b6001600160a01b0381166110cc5760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a40161042e565b606554604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1606580546001600160a01b0319166001600160a01b0392909216919091179055565b6065546001600160a01b031615801561115657506001600160a01b03821615155b6111d85760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a40161042e565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a261121b8261103e565b5050565b604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6033546001600160a01b031633146107855760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161042e565b6001600160a01b0383163b1561148157604051630b135d3f60e11b808252906001600160a01b03851690631626ba7e906113a29086908690600401611cfe565b602060405180830381865afa1580156113bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113e39190611d5b565b6001600160e01b0319161461147c5760405162461bcd60e51b815260206004820152605360248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a2045524331323731207369676e6174757265206064820152721d995c9a599a58d85d1a5bdb8819985a5b1959606a1b608482015260a40161042e565b505050565b826001600160a01b03166114958383611521565b6001600160a01b03161461147c5760405162461bcd60e51b815260206004820152604760248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a207369676e6174757265206e6f742066726f6d6064820152661039b4b3b732b960c91b608482015260a40161042e565b60008060006115308585611545565b9150915061153d816115b5565b509392505050565b60008082516041141561157c5760208301516040840151606085015160001a61157087828585611770565b945094505050506115ae565b8251604014156115a6576020830151604084015161159b86838361185d565b9350935050506115ae565b506000905060025b9250929050565b60008160048111156115c9576115c961198e565b14156115d25750565b60018160048111156115e6576115e661198e565b14156116345760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604482015260640161042e565b60028160048111156116485761164861198e565b14156116965760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604482015260640161042e565b60038160048111156116aa576116aa61198e565b14156117035760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b606482015260840161042e565b60048160048111156117175761171761198e565b14156104405760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b606482015260840161042e565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156117a75750600090506003611854565b8460ff16601b141580156117bf57508460ff16601c14155b156117d05750600090506004611854565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015611824573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661184d57600060019250925050611854565b9150600090505b94509492505050565b6000806001600160ff1b0383168161187a60ff86901c601b611d85565b905061188887828885611770565b935093505050935093915050565b6001600160a01b038116811461044057600080fd5b6000602082840312156118bd57600080fd5b81356118c881611896565b9392505050565b6000602082840312156118e157600080fd5b5035919050565b6000806000606084860312156118fd57600080fd5b833561190881611896565b9250602084013561191881611896565b929592945050506040919091013590565b6000806040838503121561193c57600080fd5b823561194781611896565b946020939093013593505050565b6000806040838503121561196857600080fd5b823561197381611896565b9150602083013561198381611896565b809150509250929050565b634e487b7160e01b600052602160045260246000fd5b60208101600283106119c657634e487b7160e01b600052602160045260246000fd5b91905290565b6000602082840312156119de57600080fd5b813560ff811681146118c857600080fd5b634e487b7160e01b600052604160045260246000fd5b6040516060810167ffffffffffffffff81118282101715611a2857611a286119ef565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715611a5757611a576119ef565b604052919050565b60008060408385031215611a7257600080fd5b8235611a7d81611896565b915060208381013567ffffffffffffffff80821115611a9b57600080fd5b9085019060608288031215611aaf57600080fd5b611ab7611a05565b823582811115611ac657600080fd5b8301601f81018913611ad757600080fd5b803583811115611ae957611ae96119ef565b611afb601f8201601f19168701611a2e565b93508084528986828401011115611b1157600080fd5b808683018786013760008682860101525050818152838301358482015260408301356040820152809450505050509250929050565b60008060008060808587031215611b5c57600080fd5b8435611b6781611896565b93506020850135611b7781611896565b93969395505050506040820135916060013590565b60008060208385031215611b9f57600080fd5b823567ffffffffffffffff80821115611bb757600080fd5b818501915085601f830112611bcb57600080fd5b813581811115611bda57600080fd5b866020828501011115611bec57600080fd5b60209290920196919550909350505050565b600060208284031215611c1057600080fd5b81516118c881611896565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b600060208284031215611c7757600080fd5b815180151581146118c857600080fd5b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b60208152816020820152818360408301376000818301604090810191909152601f909201601f19160101919050565b82815260006020604081840152835180604085015260005b81811015611d3257858101830151858201606001528201611d16565b81811115611d44576000606083870101525b50601f01601f191692909201606001949350505050565b600060208284031215611d6d57600080fd5b81516001600160e01b0319811681146118c857600080fd5b60008219821115611da657634e487b7160e01b600052601160045260246000fd5b50019056fe4156534469726563746f72792e72656769737465724f70657261746f72546f41a26469706673582212203078326ec29ef6e4c0629c3db8b9232b52ccd0d073d4926089bdbc0d9eef3c0f64736f6c634300080c0033", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_delegation\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"DOMAIN_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"OPERATOR_AVS_REGISTRATION_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"avsOperatorStatus\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumIAVSDirectory.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\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"initialPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"operatorSaltIsSpent\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"registerOperatorToAVS\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSignature\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtils.SignatureWithSaltAndExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setPauserRegistry\",\"inputs\":[{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateAVSMetadataURI\",\"inputs\":[{\"name\":\"metadataURI\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AVSMetadataURIUpdated\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorAVSRegistrationStatusUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"status\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"enumIAVSDirectory.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\":\"PauserRegistrySet\",\"inputs\":[{\"name\":\"pauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"}],\"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\":\"InvalidSignatureEIP1271\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidSignatureEOA\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyPauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnpauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OperatorAlreadyRegistered\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OperatorDoesNotExist\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OperatorNotRegistered\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SignatureExpired\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SignatureSaltSpent\",\"inputs\":[]}]", + Bin: "0x60c060405234801561001057600080fd5b50604051611a17380380611a1783398101604081905261002f9161010e565b6001600160a01b03811660805261004461004e565b504660a05261013e565b600054610100900460ff16156100ba5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101561010c576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b60006020828403121561012057600080fd5b81516001600160a01b038116811461013757600080fd5b9392505050565b60805160a0516118ad61016a6000396000610bff015260008181610324015261085f01526118ad6000f3fe608060405234801561001057600080fd5b50600436106101425760003560e01c80638da5cb5b116100b8578063d79aceab1161007c578063d79aceab146102f8578063df5cf7231461031f578063ec76f44214610346578063f2fde38b1461037a578063f698da251461038d578063fabc1cbc1461039557600080fd5b80638da5cb5b1461029b5780639926ee7d146102ac578063a1060c88146102bf578063a364f4da146102d2578063a98fb355146102e557600080fd5b806349075da31161010a57806349075da3146101fa578063595c6a67146102355780635ac86ab71461023d5780635c975abb14610260578063715018a614610268578063886f11951461027057600080fd5b806310d67a2f14610147578063136439dd1461015c5780631794bb3c1461016f57806320606b7014610182578063374823b5146101bc575b600080fd5b61015a610155366004611406565b6103a8565b005b61015a61016a36600461142a565b61045c565b61015a61017d366004611443565b610547565b6101a97f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b6040519081526020015b60405180910390f35b6101ea6101ca366004611484565b609960209081526000928352604080842090915290825290205460ff1681565b60405190151581526020016101b3565b6102286102083660046114b0565b609860209081526000928352604080842090915290825290205460ff1681565b6040516101b391906114ff565b61015a610676565b6101ea61024b366004611527565b606654600160ff9092169190911b9081161490565b6066546101a9565b61015a61073e565b606554610283906001600160a01b031681565b6040516001600160a01b0390911681526020016101b3565b6033546001600160a01b0316610283565b61015a6102ba3660046115ba565b610752565b6101a96102cd3660046116af565b61099d565b61015a6102e0366004611406565b610a56565b61015a6102f33660046116f5565b610b3e565b6101a97fda2c89bafdd34776a2b8bb9c83c82f419e20cc8c67207f70edd58249b92661bd81565b6102837f000000000000000000000000000000000000000000000000000000000000000081565b61015a61035436600461142a565b33600090815260996020908152604080832093835292905220805460ff19166001179055565b61015a610388366004611406565b610b85565b6101a9610bfb565b61015a6103a336600461142a565b610c38565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156103fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061041f9190611769565b6001600160a01b0316336001600160a01b0316146104505760405163794821ff60e01b815260040160405180910390fd5b61045981610d40565b50565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa1580156104a4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104c89190611786565b6104e557604051631d77d47760e21b815260040160405180910390fd5b606654818116146105095760405163c61dca5d60e01b815260040160405180910390fd5b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b600054610100900460ff16158080156105675750600054600160ff909116105b806105815750303b158015610581575060005460ff166001145b6105e95760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff19166001179055801561060c576000805461ff0019166101001790555b6106168383610dd0565b61061e610e55565b60975561062a84610eec565b8015610670576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa1580156106be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106e29190611786565b6106ff57604051631d77d47760e21b815260040160405180910390fd5b600019606681905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b610746610f3e565b6107506000610eec565b565b60665460009060019081160361077b5760405163840a48d560e01b815260040160405180910390fd5b42826040015110156107a057604051630819bdcd60e01b815260040160405180910390fd5b60013360009081526098602090815260408083206001600160a01b038816845290915290205460ff1660018111156107da576107da6114e9565b036107f8576040516342ee68b560e01b815260040160405180910390fd5b6001600160a01b038316600090815260996020908152604080832085830151845290915290205460ff161561084057604051639a5afeb760e01b815260040160405180910390fd5b6040516336b87bd760e11b81526001600160a01b0384811660048301527f00000000000000000000000000000000000000000000000000000000000000001690636d70f7ae90602401602060405180830381865afa1580156108a6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108ca9190611786565b6108e7576040516325878fa360e21b815260040160405180910390fd5b60006108fd84338560200151866040015161099d565b905061090e84828560000151610f98565b3360008181526098602090815260408083206001600160a01b0389168085529083528184208054600160ff199182168117909255609985528386208a860151875290945293829020805490931684179092555190917ff0952b1c65271d819d39983d2abb044b9cace59bcc4d4dd389f586ebdcb15b419161098f91906114ff565b60405180910390a350505050565b604080517fda2c89bafdd34776a2b8bb9c83c82f419e20cc8c67207f70edd58249b92661bd6020808301919091526001600160a01b0387811683850152861660608301526080820185905260a08083018590528351808403909101815260c0909201909252805191012060009081610a13610bfb565b60405161190160f01b602082015260228101919091526042810183905260620160408051808303601f190181529190528051602090910120979650505050505050565b606654600090600190811603610a7f5760405163840a48d560e01b815260040160405180910390fd5b60013360009081526098602090815260408083206001600160a01b038716845290915290205460ff166001811115610ab957610ab96114e9565b14610ad7576040516325ec6c1f60e01b815260040160405180910390fd5b3360008181526098602090815260408083206001600160a01b0387168085529252808320805460ff191690555190917ff0952b1c65271d819d39983d2abb044b9cace59bcc4d4dd389f586ebdcb15b4191610b3291906114ff565b60405180910390a35050565b336001600160a01b03167fa89c1dc243d8908a96dd84944bcc97d6bc6ac00dd78e20621576be6a3c9437138383604051610b799291906117a8565b60405180910390a25050565b610b8d610f3e565b6001600160a01b038116610bf25760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016105e0565b61045981610eec565b60007f00000000000000000000000000000000000000000000000000000000000000004603610c2b575060975490565b610c33610e55565b905090565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c8b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610caf9190611769565b6001600160a01b0316336001600160a01b031614610ce05760405163794821ff60e01b815260040160405180910390fd5b606654198119606654191614610d095760405163c61dca5d60e01b815260040160405180910390fd5b606681905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200161053c565b6001600160a01b038116610d67576040516339b190bb60e11b815260040160405180910390fd5b606554604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1606580546001600160a01b0319166001600160a01b0392909216919091179055565b6065546001600160a01b0316158015610df157506001600160a01b03821615155b610e0e576040516339b190bb60e11b815260040160405180910390fd5b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2610e5182610d40565b5050565b604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6033546001600160a01b031633146107505760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016105e0565b6001600160a01b0383163b1561104657604051630b135d3f60e11b808252906001600160a01b03851690631626ba7e90610fd890869086906004016117d7565b602060405180830381865afa158015610ff5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611019919061182c565b6001600160e01b031916146110415760405163026aa43360e31b815260040160405180910390fd5b505050565b826001600160a01b031661105a8383611081565b6001600160a01b031614611041576040516306c653c360e31b815260040160405180910390fd5b600080600061109085856110a7565b9150915061109d81611115565b5090505b92915050565b60008082516041036110dd5760208301516040840151606085015160001a6110d1878285856112cb565b9450945050505061110e565b825160400361110657602083015160408401516110fb8683836113b8565b93509350505061110e565b506000905060025b9250929050565b6000816004811115611129576111296114e9565b036111315750565b6001816004811115611145576111456114e9565b036111925760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064016105e0565b60028160048111156111a6576111a66114e9565b036111f35760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016105e0565b6003816004811115611207576112076114e9565b0361125f5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b60648201526084016105e0565b6004816004811115611273576112736114e9565b036104595760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b60648201526084016105e0565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561130257506000905060036113af565b8460ff16601b1415801561131a57508460ff16601c14155b1561132b57506000905060046113af565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa15801561137f573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166113a8576000600192509250506113af565b9150600090505b94509492505050565b6000806001600160ff1b038316816113d560ff86901c601b611856565b90506113e3878288856112cb565b935093505050935093915050565b6001600160a01b038116811461045957600080fd5b60006020828403121561141857600080fd5b8135611423816113f1565b9392505050565b60006020828403121561143c57600080fd5b5035919050565b60008060006060848603121561145857600080fd5b8335611463816113f1565b92506020840135611473816113f1565b929592945050506040919091013590565b6000806040838503121561149757600080fd5b82356114a2816113f1565b946020939093013593505050565b600080604083850312156114c357600080fd5b82356114ce816113f1565b915060208301356114de816113f1565b809150509250929050565b634e487b7160e01b600052602160045260246000fd5b602081016002831061152157634e487b7160e01b600052602160045260246000fd5b91905290565b60006020828403121561153957600080fd5b813560ff8116811461142357600080fd5b634e487b7160e01b600052604160045260246000fd5b6040516060810167ffffffffffffffff811182821017156115835761158361154a565b60405290565b604051601f8201601f1916810167ffffffffffffffff811182821017156115b2576115b261154a565b604052919050565b600080604083850312156115cd57600080fd5b82356115d8816113f1565b9150602083013567ffffffffffffffff8111156115f457600080fd5b83016060818603121561160657600080fd5b61160e611560565b813567ffffffffffffffff81111561162557600080fd5b8201601f8101871361163657600080fd5b803567ffffffffffffffff8111156116505761165061154a565b611663601f8201601f1916602001611589565b81815288602083850101111561167857600080fd5b8160208401602083013760006020928201830152835283810135908301525060409182013591810191909152919491935090915050565b600080600080608085870312156116c557600080fd5b84356116d0816113f1565b935060208501356116e0816113f1565b93969395505050506040820135916060013590565b6000806020838503121561170857600080fd5b823567ffffffffffffffff81111561171f57600080fd5b8301601f8101851361173057600080fd5b803567ffffffffffffffff81111561174757600080fd5b85602082840101111561175957600080fd5b6020919091019590945092505050565b60006020828403121561177b57600080fd5b8151611423816113f1565b60006020828403121561179857600080fd5b8151801515811461142357600080fd5b60208152816020820152818360408301376000818301604090810191909152601f909201601f19160101919050565b828152604060208201526000825180604084015260005b8181101561180b57602081860181015160608684010152016117ee565b506000606082850101526060601f19601f8301168401019150509392505050565b60006020828403121561183e57600080fd5b81516001600160e01b03198116811461142357600080fd5b808201808211156110a157634e487b7160e01b600052601160045260246000fdfea26469706673582212207a582f1623ddd4e18be72e65b722d04993b5bccbf6764780b498d5c4415346af64736f6c634300081b0033", } // AVSDirectoryABI is the input ABI used to generate the binding from. diff --git a/pkg/bindings/AVSDirectoryStorage/binding.go b/pkg/bindings/AVSDirectoryStorage/binding.go index 2070a8e69..558c6dd8f 100644 --- a/pkg/bindings/AVSDirectoryStorage/binding.go +++ b/pkg/bindings/AVSDirectoryStorage/binding.go @@ -38,7 +38,7 @@ type ISignatureUtilsSignatureWithSaltAndExpiry struct { // AVSDirectoryStorageMetaData contains all meta data concerning the AVSDirectoryStorage contract. var AVSDirectoryStorageMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"function\",\"name\":\"DOMAIN_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"OPERATOR_AVS_REGISTRATION_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"avsOperatorStatus\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumIAVSDirectory.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\":\"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\":\"operatorSaltIsSpent\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"registerOperatorToAVS\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSignature\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtils.SignatureWithSaltAndExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateAVSMetadataURI\",\"inputs\":[{\"name\":\"metadataURI\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AVSMetadataURIUpdated\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorAVSRegistrationStatusUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"status\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"enumIAVSDirectory.OperatorAVSRegistrationStatus\"}],\"anonymous\":false}]", + ABI: "[{\"type\":\"function\",\"name\":\"DOMAIN_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"OPERATOR_AVS_REGISTRATION_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"avsOperatorStatus\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumIAVSDirectory.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\":\"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\":\"operatorSaltIsSpent\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"registerOperatorToAVS\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSignature\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtils.SignatureWithSaltAndExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateAVSMetadataURI\",\"inputs\":[{\"name\":\"metadataURI\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AVSMetadataURIUpdated\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorAVSRegistrationStatusUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"status\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"enumIAVSDirectory.OperatorAVSRegistrationStatus\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"OperatorAlreadyRegistered\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OperatorDoesNotExist\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OperatorNotRegistered\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SignatureExpired\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SignatureSaltSpent\",\"inputs\":[]}]", } // AVSDirectoryStorageABI is the input ABI used to generate the binding from. diff --git a/pkg/bindings/BackingEigen/binding.go b/pkg/bindings/BackingEigen/binding.go index 7adf41315..14eef1436 100644 --- a/pkg/bindings/BackingEigen/binding.go +++ b/pkg/bindings/BackingEigen/binding.go @@ -38,7 +38,7 @@ type ERC20VotesUpgradeableCheckpoint struct { // BackingEigenMetaData contains all meta data concerning the BackingEigen contract. var BackingEigenMetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_EIGEN\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"CLOCK_MODE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"DOMAIN_SEPARATOR\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"EIGEN\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"allowance\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"allowedFrom\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"allowedTo\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"approve\",\"inputs\":[{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"balanceOf\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"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\":\"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\":\"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\":\"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: "0x60a06040523480156200001157600080fd5b5060405162002b4438038062002b44833981016040819052620000349162000113565b6001600160a01b0381166080526200004b62000052565b5062000145565b600054610100900460ff1615620000bf5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff9081161462000111576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6000602082840312156200012657600080fd5b81516001600160a01b03811681146200013e57600080fd5b9392505050565b6080516129c76200017d6000396000818161056f01528181610c5b01528181610c8601528181610cb10152610cd201526129c76000f3fe608060405234801561001057600080fd5b506004361061021c5760003560e01c806384b0196e11610125578063b8c25594116100ad578063dd62ed3e1161007c578063dd62ed3e146104ff578063eb415f4514610512578063f1127ed81461051a578063f2fde38b14610557578063fdc371ce1461056a57600080fd5b8063b8c25594146104b3578063c3cda520146104c6578063c4d66de8146104d9578063d505accf146104ec57600080fd5b806395d89b41116100f457806395d89b41146104685780639ab24eb0146104705780639aec4bae14610483578063a457c2d71461048d578063a9059cbb146104a057600080fd5b806384b0196e1461040a5780638da5cb5b146104255780638e539e8c1461043657806391ddadf41461044957600080fd5b80633a46b1a8116101a85780636fcfff45116101775780636fcfff451461037a57806370a08231146103a2578063715018a6146103cb57806378aa33ba146103d35780637ecebe00146103f757600080fd5b80633a46b1a8146102e65780634bf5d7e9146102f9578063587cde1e146103235780635c19a95c1461036757600080fd5b80631ffacdef116101ef5780631ffacdef1461029457806323b872dd146102a9578063313ce567146102bc5780633644e515146102cb57806339509351146102d357600080fd5b80630455e6941461022157806306fdde031461025a578063095ea7b31461026f57806318160ddd14610282575b600080fd5b61024561022f366004612548565b6101316020526000908152604090205460ff1681565b60405190151581526020015b60405180910390f35b610262610591565b60405161025191906125b0565b61024561027d3660046125c3565b610623565b6067545b604051908152602001610251565b6102a76102a23660046125ed565b61063b565b005b6102456102b7366004612629565b610651565b60405160128152602001610251565b610286610675565b6102456102e13660046125c3565b610684565b6102866102f43660046125c3565b6106a6565b60408051808201909152600e81526d06d6f64653d74696d657374616d760941b6020820152610262565b61034f610331366004612548565b6001600160a01b03908116600090815260fe60205260409020541690565b6040516001600160a01b039091168152602001610251565b6102a7610375366004612548565b610730565b61038d610388366004612548565b61073d565b60405163ffffffff9091168152602001610251565b6102866103b0366004612548565b6001600160a01b031660009081526065602052604090205490565b6102a7610765565b6102456103e1366004612548565b6101326020526000908152604090205460ff1681565b610286610405366004612548565b610779565b610412610797565b6040516102519796959493929190612665565b6033546001600160a01b031661034f565b6102866104443660046126fb565b610835565b61045161089d565b60405165ffffffffffff9091168152602001610251565b6102626108a8565b61028661047e366004612548565b6108b7565b6102866101305481565b61024561049b3660046125c3565b610939565b6102456104ae3660046125c3565b6109b4565b6102a76104c13660046125ed565b6109c2565b6102a76104d4366004612725565b6109d4565b6102a76104e7366004612548565b610b0a565b6102a76104fa36600461277d565b610dc9565b61028661050d3660046127e7565b610f2d565b6102a7610f58565b61052d61052836600461281a565b611028565b60408051825163ffffffff1681526020928301516001600160e01b03169281019290925201610251565b6102a7610565366004612548565b6110ac565b61034f7f000000000000000000000000000000000000000000000000000000000000000081565b6060606880546105a09061284f565b80601f01602080910402602001604051908101604052809291908181526020018280546105cc9061284f565b80156106195780601f106105ee57610100808354040283529160200191610619565b820191906000526020600020905b8154815290600101906020018083116105fc57829003601f168201915b5050505050905090565b600033610631818585611122565b5060019392505050565b610643611246565b61064d82826112a0565b5050565b60003361065f858285611301565b61066a85858561137b565b506001949350505050565b600061067f611537565b905090565b6000336106318185856106978383610f2d565b6106a1919061289a565b611122565b60006106b061089d565b65ffffffffffff1682106107075760405162461bcd60e51b815260206004820152601960248201527804552433230566f7465733a20667574757265206c6f6f6b757603c1b60448201526064015b60405180910390fd5b6001600160a01b038316600090815260ff602052604090206107299083611541565b9392505050565b61073a338261162a565b50565b6001600160a01b038116600090815260ff602052604081205461075f906116a4565b92915050565b61076d611246565b610777600061170d565b565b6001600160a01b038116600090815260cb602052604081205461075f565b6000606080600080600060606097546000801b1480156107b75750609854155b6107fb5760405162461bcd60e51b81526020600482015260156024820152741152540dcc4c8e88155b9a5b9a5d1a585b1a5e9959605a1b60448201526064016106fe565b61080361175f565b61080b61176e565b60408051600080825260208201909252600f60f81b9b939a50919850469750309650945092509050565b600061083f61089d565b65ffffffffffff1682106108915760405162461bcd60e51b815260206004820152601960248201527804552433230566f7465733a20667574757265206c6f6f6b757603c1b60448201526064016106fe565b61075f61010083611541565b600061067f4261177d565b6060606980546105a09061284f565b6001600160a01b038116600090815260ff60205260408120548015610926576001600160a01b038316600090815260ff6020526040902080546000198301908110610904576109046128b2565b60009182526020909120015464010000000090046001600160e01b0316610929565b60005b6001600160e01b03169392505050565b600033816109478286610f2d565b9050838110156109a75760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016106fe565b61066a8286868403611122565b60003361063181858561137b565b6109ca611246565b61064d82826117e4565b83421115610a245760405162461bcd60e51b815260206004820152601d60248201527f4552433230566f7465733a207369676e6174757265206578706972656400000060448201526064016106fe565b604080517fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf60208201526001600160a01b038816918101919091526060810186905260808101859052600090610a9e90610a969060a0016040516020818303038152906040528051906020012061183d565b85858561186a565b9050610aa981611892565b8614610af75760405162461bcd60e51b815260206004820152601960248201527f4552433230566f7465733a20696e76616c6964206e6f6e63650000000000000060448201526064016106fe565b610b01818861162a565b50505050505050565b600054610100900460ff1615808015610b2a5750600054600160ff909116105b80610b445750303b158015610b44575060005460ff166001145b610ba75760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016106fe565b6000805460ff191660011790558015610bca576000805461ff0019166101001790555b610bd26118ba565b610c1f6040518060400160405280600d81526020016c2130b1b5b4b7339022b4b3b2b760991b815250604051806040016040528060068152602001653122a4a3a2a760d11b8152506118e9565b610c288261170d565b610c4f604051806040016040528060068152602001653122a4a3a2a760d11b81525061191a565b60001961013055610c817f000000000000000000000000000000000000000000000000000000000000000060016112a0565b610cac7f000000000000000000000000000000000000000000000000000000000000000060016117e4565b610d577f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d2e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d5291906128c8565b611964565b6040517fb7c23c1e2e36f298e9879a88ecfcd07e28fbb439bcfa9c78ca1363ca14370d2690600090a1801561064d576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050565b83421115610e195760405162461bcd60e51b815260206004820152601d60248201527f45524332305065726d69743a206578706972656420646561646c696e6500000060448201526064016106fe565b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9888888610e488c611892565b6040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506000610ea38261183d565b90506000610eb38287878761186a565b9050896001600160a01b0316816001600160a01b031614610f165760405162461bcd60e51b815260206004820152601e60248201527f45524332305065726d69743a20696e76616c6964207369676e6174757265000060448201526064016106fe565b610f218a8a8a611122565b50505050505050505050565b6001600160a01b03918216600090815260666020908152604080832093909416825291909152205490565b610f60611246565b6000196101305414610ff75760405162461bcd60e51b815260206004820152605460248201527f4261636b696e67456967656e2e64697361626c655472616e736665725265737460448201527f72696374696f6e733a207472616e73666572207265737472696374696f6e7320606482015273185c9948185b1c9958591e48191a5cd8589b195960621b608482015260a4016106fe565b60006101308190556040517f2b18986d3ba809db2f13a5d7bf17f60d357b37d9cbb55dd71cbbac8dc4060f649190a1565b60408051808201909152600080825260208201526001600160a01b038316600090815260ff60205260409020805463ffffffff841690811061106c5761106c6128b2565b60009182526020918290206040805180820190915291015463ffffffff8116825264010000000090046001600160e01b0316918101919091529392505050565b6110b4611246565b6001600160a01b0381166111195760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016106fe565b61073a8161170d565b6001600160a01b0383166111845760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016106fe565b6001600160a01b0382166111e55760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016106fe565b6001600160a01b0383811660008181526066602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6033546001600160a01b031633146107775760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016106fe565b6001600160a01b03821660008181526101316020908152604091829020805460ff191685151590811790915591519182527fcf20b1ecb604b0e8888d579c64e8a3b10e590d45c1c2dddb393bed284362227191015b60405180910390a25050565b600061130d8484610f2d565b9050600019811461137557818110156113685760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016106fe565b6113758484848403611122565b50505050565b6001600160a01b0383166113df5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016106fe565b6001600160a01b0382166114415760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016106fe565b61144c8383836119ef565b6001600160a01b038316600090815260656020526040902054818110156114c45760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016106fe565b6001600160a01b0380851660008181526065602052604080822086860390559286168082529083902080548601905591517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906115249086815260200190565b60405180910390a3611375848484611acd565b600061067f611aff565b81546000908181600581111561159b57600061155c84611b73565b61156690856128e1565b600088815260209020909150869082015463ffffffff16111561158b57809150611599565b61159681600161289a565b92505b505b808210156115e85760006115af8383611c58565b600088815260209020909150869082015463ffffffff1611156115d4578091506115e2565b6115df81600161289a565b92505b5061159b565b8015611614576000868152602090208101600019015464010000000090046001600160e01b0316611617565b60005b6001600160e01b03169695505050505050565b6001600160a01b03828116600081815260fe6020818152604080842080546065845282862054949093528787166001600160a01b03198416811790915590519190951694919391928592917f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a4611375828483611c73565b600063ffffffff8211156117095760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203360448201526532206269747360d01b60648201526084016106fe565b5090565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6060609980546105a09061284f565b6060609a80546105a09061284f565b600065ffffffffffff8211156117095760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203460448201526538206269747360d01b60648201526084016106fe565b6001600160a01b03821660008181526101326020908152604091829020805460ff191685151590811790915591519182527f72a561d1af7409467dae4f1e9fc52590a9335a1dda17727e2b6aa8c4db35109b91016112f5565b600061075f61184a611537565b8360405161190160f01b8152600281019290925260228201526042902090565b600080600061187b87878787611db0565b9150915061188881611e74565b5095945050505050565b6001600160a01b038116600090815260cb602052604090208054600181018255905b50919050565b600054610100900460ff166118e15760405162461bcd60e51b81526004016106fe906128f8565b610777611fc2565b600054610100900460ff166119105760405162461bcd60e51b81526004016106fe906128f8565b61064d8282611ff2565b600054610100900460ff166119415760405162461bcd60e51b81526004016106fe906128f8565b61073a81604051806040016040528060018152602001603160f81b815250612040565b61196e828261209d565b6067546001600160e01b0310156119e05760405162461bcd60e51b815260206004820152603060248201527f4552433230566f7465733a20746f74616c20737570706c79207269736b73206f60448201526f766572666c6f77696e6720766f74657360801b60648201526084016106fe565b6113756101006121728361217e565b610130544211611ac8576001600160a01b0383166000908152610131602052604090205460ff1680611a3a57506001600160a01b0382166000908152610132602052604090205460ff165b80611a4c57506001600160a01b038316155b611ac85760405162461bcd60e51b815260206004820152604160248201527f4261636b696e67456967656e2e5f6265666f7265546f6b656e5472616e73666560448201527f723a2066726f6d206f7220746f206d7573742062652077686974656c697374656064820152601960fa1b608482015260a4016106fe565b505050565b6001600160a01b03838116600090815260fe6020526040808220548584168352912054611ac892918216911683611c73565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611b2a6122f3565b611b3261234c565b60408051602081019490945283019190915260608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b600081611b8257506000919050565b60006001611b8f8461237d565b901c6001901b90506001818481611ba857611ba8612943565b048201901c90506001818481611bc057611bc0612943565b048201901c90506001818481611bd857611bd8612943565b048201901c90506001818481611bf057611bf0612943565b048201901c90506001818481611c0857611c08612943565b048201901c90506001818481611c2057611c20612943565b048201901c90506001818481611c3857611c38612943565b048201901c905061072981828581611c5257611c52612943565b04612411565b6000611c676002848418612959565b6107299084841661289a565b816001600160a01b0316836001600160a01b031614158015611c955750600081115b15611ac8576001600160a01b03831615611d23576001600160a01b038316600090815260ff602052604081208190611cd0906124278561217e565b91509150846001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051611d18929190918252602082015260400190565b60405180910390a250505b6001600160a01b03821615611ac8576001600160a01b038216600090815260ff602052604081208190611d59906121728561217e565b91509150836001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051611da1929190918252602082015260400190565b60405180910390a25050505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115611de75750600090506003611e6b565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015611e3b573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116611e6457600060019250925050611e6b565b9150600090505b94509492505050565b6000816004811115611e8857611e8861297b565b1415611e915750565b6001816004811115611ea557611ea561297b565b1415611ef35760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064016106fe565b6002816004811115611f0757611f0761297b565b1415611f555760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016106fe565b6003816004811115611f6957611f6961297b565b141561073a5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b60648201526084016106fe565b600054610100900460ff16611fe95760405162461bcd60e51b81526004016106fe906128f8565b6107773361170d565b600054610100900460ff166120195760405162461bcd60e51b81526004016106fe906128f8565b815161202c90606890602085019061249c565b508051611ac890606990602084019061249c565b600054610100900460ff166120675760405162461bcd60e51b81526004016106fe906128f8565b815161207a90609990602085019061249c565b50805161208e90609a90602084019061249c565b50506000609781905560985550565b6001600160a01b0382166120f35760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016106fe565b6120ff600083836119ef565b8060676000828254612111919061289a565b90915550506001600160a01b0382166000818152606560209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a361064d60008383611acd565b6000610729828461289a565b825460009081908181156121cb5760008781526020902082016000190160408051808201909152905463ffffffff8116825264010000000090046001600160e01b031660208201526121e0565b60408051808201909152600080825260208201525b905080602001516001600160e01b0316935061220084868863ffffffff16565b925060008211801561222a575061221561089d565b65ffffffffffff16816000015163ffffffff16145b1561226f5761223883612433565b60008881526020902083016000190180546001600160e01b03929092166401000000000263ffffffff9092169190911790556122e9565b86604051806040016040528061229361228661089d565b65ffffffffffff166116a4565b63ffffffff1681526020016122a786612433565b6001600160e01b0390811690915282546001810184556000938452602093849020835194909301519091166401000000000263ffffffff909316929092179101555b5050935093915050565b6000806122fe61175f565b805190915015612315578051602090910120919050565b60975480156123245792915050565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4709250505090565b60008061235761176e565b80519091501561236e578051602090910120919050565b60985480156123245792915050565b600080608083901c1561239257608092831c92015b604083901c156123a457604092831c92015b602083901c156123b657602092831c92015b601083901c156123c857601092831c92015b600883901c156123da57600892831c92015b600483901c156123ec57600492831c92015b600283901c156123fe57600292831c92015b600183901c1561075f5760010192915050565b60008183106124205781610729565b5090919050565b600061072982846128e1565b60006001600160e01b038211156117095760405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e20326044820152663234206269747360c81b60648201526084016106fe565b8280546124a89061284f565b90600052602060002090601f0160209004810192826124ca5760008555612510565b82601f106124e357805160ff1916838001178555612510565b82800160010185558215612510579182015b828111156125105782518255916020019190600101906124f5565b506117099291505b808211156117095760008155600101612518565b80356001600160a01b038116811461254357600080fd5b919050565b60006020828403121561255a57600080fd5b6107298261252c565b6000815180845260005b818110156125895760208185018101518683018201520161256d565b8181111561259b576000602083870101525b50601f01601f19169290920160200192915050565b6020815260006107296020830184612563565b600080604083850312156125d657600080fd5b6125df8361252c565b946020939093013593505050565b6000806040838503121561260057600080fd5b6126098361252c565b91506020830135801515811461261e57600080fd5b809150509250929050565b60008060006060848603121561263e57600080fd5b6126478461252c565b92506126556020850161252c565b9150604084013590509250925092565b60ff60f81b881681526000602060e08184015261268560e084018a612563565b8381036040850152612697818a612563565b606085018990526001600160a01b038816608086015260a0850187905284810360c0860152855180825283870192509083019060005b818110156126e9578351835292840192918401916001016126cd565b50909c9b505050505050505050505050565b60006020828403121561270d57600080fd5b5035919050565b803560ff8116811461254357600080fd5b60008060008060008060c0878903121561273e57600080fd5b6127478761252c565b9550602087013594506040870135935061276360608801612714565b92506080870135915060a087013590509295509295509295565b600080600080600080600060e0888a03121561279857600080fd5b6127a18861252c565b96506127af6020890161252c565b955060408801359450606088013593506127cb60808901612714565b925060a0880135915060c0880135905092959891949750929550565b600080604083850312156127fa57600080fd5b6128038361252c565b91506128116020840161252c565b90509250929050565b6000806040838503121561282d57600080fd5b6128368361252c565b9150602083013563ffffffff8116811461261e57600080fd5b600181811c9082168061286357607f821691505b602082108114156118b457634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600082198211156128ad576128ad612884565b500190565b634e487b7160e01b600052603260045260246000fd5b6000602082840312156128da57600080fd5b5051919050565b6000828210156128f3576128f3612884565b500390565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b634e487b7160e01b600052601260045260246000fd5b60008261297657634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052602160045260246000fdfea26469706673582212208696d7fc75edc692b65d65df10ce07940ca4f7436f6a38a536db45f6904769aa64736f6c634300080c0033", + Bin: "0x60a060405234801561001057600080fd5b50604051612b9c380380612b9c83398101604081905261002f91610109565b6001600160a01b03811660805261004461004a565b50610139565b600054610100900460ff16156100b65760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff90811614610107576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b60006020828403121561011b57600080fd5b81516001600160a01b038116811461013257600080fd5b9392505050565b608051612a2c6101706000396000818161056f01528181610c5701528181610c8201528181610cad0152610cce0152612a2c6000f3fe608060405234801561001057600080fd5b506004361061021c5760003560e01c806384b0196e11610125578063b8c25594116100ad578063dd62ed3e1161007c578063dd62ed3e146104ff578063eb415f4514610512578063f1127ed81461051a578063f2fde38b14610557578063fdc371ce1461056a57600080fd5b8063b8c25594146104b3578063c3cda520146104c6578063c4d66de8146104d9578063d505accf146104ec57600080fd5b806395d89b41116100f457806395d89b41146104685780639ab24eb0146104705780639aec4bae14610483578063a457c2d71461048d578063a9059cbb146104a057600080fd5b806384b0196e1461040a5780638da5cb5b146104255780638e539e8c1461043657806391ddadf41461044957600080fd5b80633a46b1a8116101a85780636fcfff45116101775780636fcfff451461037a57806370a08231146103a2578063715018a6146103cb57806378aa33ba146103d35780637ecebe00146103f757600080fd5b80633a46b1a8146102e65780634bf5d7e9146102f9578063587cde1e146103235780635c19a95c1461036757600080fd5b80631ffacdef116101ef5780631ffacdef1461029457806323b872dd146102a9578063313ce567146102bc5780633644e515146102cb57806339509351146102d357600080fd5b80630455e6941461022157806306fdde031461025a578063095ea7b31461026f57806318160ddd14610282575b600080fd5b61024561022f366004612497565b6101316020526000908152604090205460ff1681565b60405190151581526020015b60405180910390f35b610262610591565b60405161025191906124f8565b61024561027d36600461250b565b610623565b6067545b604051908152602001610251565b6102a76102a2366004612535565b61063d565b005b6102456102b7366004612571565b610653565b60405160128152602001610251565b610286610677565b6102456102e136600461250b565b610686565b6102866102f436600461250b565b6106a8565b60408051808201909152600e81526d06d6f64653d74696d657374616d760941b6020820152610262565b61034f610331366004612497565b6001600160a01b03908116600090815260fe60205260409020541690565b6040516001600160a01b039091168152602001610251565b6102a7610375366004612497565b610732565b61038d610388366004612497565b61073f565b60405163ffffffff9091168152602001610251565b6102866103b0366004612497565b6001600160a01b031660009081526065602052604090205490565b6102a7610761565b6102456103e1366004612497565b6101326020526000908152604090205460ff1681565b610286610405366004612497565b610775565b610412610793565b60405161025197969594939291906125ae565b6033546001600160a01b031661034f565b610286610444366004612646565b610831565b610451610899565b60405165ffffffffffff9091168152602001610251565b6102626108a4565b61028661047e366004612497565b6108b3565b6102866101305481565b61024561049b36600461250b565b610935565b6102456104ae36600461250b565b6109b0565b6102a76104c1366004612535565b6109be565b6102a76104d4366004612670565b6109d0565b6102a76104e7366004612497565b610b06565b6102a76104fa3660046126c8565b610dc5565b61028661050d366004612733565b610f29565b6102a7610f54565b61052d610528366004612766565b611024565b60408051825163ffffffff1681526020928301516001600160e01b03169281019290925201610251565b6102a7610565366004612497565b6110a8565b61034f7f000000000000000000000000000000000000000000000000000000000000000081565b6060606880546105a09061279b565b80601f01602080910402602001604051908101604052809291908181526020018280546105cc9061279b565b80156106195780601f106105ee57610100808354040283529160200191610619565b820191906000526020600020905b8154815290600101906020018083116105fc57829003601f168201915b5050505050905090565b60003361063181858561111e565b60019150505b92915050565b610645611242565b61064f828261129c565b5050565b6000336106618582856112fd565b61066c858585611377565b506001949350505050565b6000610681611533565b905090565b6000336106318185856106998383610f29565b6106a391906127e5565b61111e565b60006106b2610899565b65ffffffffffff1682106107095760405162461bcd60e51b815260206004820152601960248201527804552433230566f7465733a20667574757265206c6f6f6b757603c1b60448201526064015b60405180910390fd5b6001600160a01b038316600090815260ff6020526040902061072b908361153d565b9392505050565b61073c3382611626565b50565b6001600160a01b038116600090815260ff6020526040812054610637906116a0565b610769611242565b6107736000611709565b565b6001600160a01b038116600090815260cb6020526040812054610637565b6000606080600080600060606097546000801b1480156107b35750609854155b6107f75760405162461bcd60e51b81526020600482015260156024820152741152540dcc4c8e88155b9a5b9a5d1a585b1a5e9959605a1b6044820152606401610700565b6107ff61175b565b61080761176a565b60408051600080825260208201909252600f60f81b9b939a50919850469750309650945092509050565b600061083b610899565b65ffffffffffff16821061088d5760405162461bcd60e51b815260206004820152601960248201527804552433230566f7465733a20667574757265206c6f6f6b757603c1b6044820152606401610700565b6106376101008361153d565b600061068142611779565b6060606980546105a09061279b565b6001600160a01b038116600090815260ff60205260408120548015610922576001600160a01b038316600090815260ff60205260409020805460001983019081106109005761090061280e565b60009182526020909120015464010000000090046001600160e01b0316610925565b60005b6001600160e01b03169392505050565b600033816109438286610f29565b9050838110156109a35760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610700565b61066c828686840361111e565b600033610631818585611377565b6109c6611242565b61064f82826117e0565b83421115610a205760405162461bcd60e51b815260206004820152601d60248201527f4552433230566f7465733a207369676e617475726520657870697265640000006044820152606401610700565b604080517fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf60208201526001600160a01b038816918101919091526060810186905260808101859052600090610a9a90610a929060a00160405160208183030381529060405280519060200120611839565b858585611866565b9050610aa58161188e565b8614610af35760405162461bcd60e51b815260206004820152601960248201527f4552433230566f7465733a20696e76616c6964206e6f6e6365000000000000006044820152606401610700565b610afd8188611626565b50505050505050565b600054610100900460ff1615808015610b265750600054600160ff909116105b80610b405750303b158015610b40575060005460ff166001145b610ba35760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610700565b6000805460ff191660011790558015610bc6576000805461ff0019166101001790555b610bce6118b6565b610c1b6040518060400160405280600d81526020016c2130b1b5b4b7339022b4b3b2b760991b815250604051806040016040528060068152602001653122a4a3a2a760d11b8152506118e5565b610c2482611709565b610c4b604051806040016040528060068152602001653122a4a3a2a760d11b815250611916565b60001961013055610c7d7f0000000000000000000000000000000000000000000000000000000000000000600161129c565b610ca87f000000000000000000000000000000000000000000000000000000000000000060016117e0565b610d537f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d2a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d4e9190612824565b611960565b6040517fb7c23c1e2e36f298e9879a88ecfcd07e28fbb439bcfa9c78ca1363ca14370d2690600090a1801561064f576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050565b83421115610e155760405162461bcd60e51b815260206004820152601d60248201527f45524332305065726d69743a206578706972656420646561646c696e650000006044820152606401610700565b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9888888610e448c61188e565b6040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506000610e9f82611839565b90506000610eaf82878787611866565b9050896001600160a01b0316816001600160a01b031614610f125760405162461bcd60e51b815260206004820152601e60248201527f45524332305065726d69743a20696e76616c6964207369676e617475726500006044820152606401610700565b610f1d8a8a8a61111e565b50505050505050505050565b6001600160a01b03918216600090815260666020908152604080832093909416825291909152205490565b610f5c611242565b6000196101305414610ff35760405162461bcd60e51b815260206004820152605460248201527f4261636b696e67456967656e2e64697361626c655472616e736665725265737460448201527f72696374696f6e733a207472616e73666572207265737472696374696f6e7320606482015273185c9948185b1c9958591e48191a5cd8589b195960621b608482015260a401610700565b60006101308190556040517f2b18986d3ba809db2f13a5d7bf17f60d357b37d9cbb55dd71cbbac8dc4060f649190a1565b60408051808201909152600080825260208201526001600160a01b038316600090815260ff60205260409020805463ffffffff84169081106110685761106861280e565b60009182526020918290206040805180820190915291015463ffffffff8116825264010000000090046001600160e01b0316918101919091529392505050565b6110b0611242565b6001600160a01b0381166111155760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610700565b61073c81611709565b6001600160a01b0383166111805760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610700565b6001600160a01b0382166111e15760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610700565b6001600160a01b0383811660008181526066602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6033546001600160a01b031633146107735760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610700565b6001600160a01b03821660008181526101316020908152604091829020805460ff191685151590811790915591519182527fcf20b1ecb604b0e8888d579c64e8a3b10e590d45c1c2dddb393bed284362227191015b60405180910390a25050565b60006113098484610f29565b9050600019811461137157818110156113645760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610700565b611371848484840361111e565b50505050565b6001600160a01b0383166113db5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610700565b6001600160a01b03821661143d5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610700565b6114488383836119eb565b6001600160a01b038316600090815260656020526040902054818110156114c05760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610700565b6001600160a01b0380851660008181526065602052604080822086860390559286168082529083902080548601905591517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906115209086815260200190565b60405180910390a3611371848484611ac9565b6000610681611afb565b81546000908181600581111561159757600061155884611b6f565b611562908561283d565b600088815260209020909150869082015463ffffffff16111561158757809150611595565b6115928160016127e5565b92505b505b808210156115e45760006115ab8383611c57565b600088815260209020909150869082015463ffffffff1611156115d0578091506115de565b6115db8160016127e5565b92505b50611597565b8015611610576000868152602090208101600019015464010000000090046001600160e01b0316611613565b60005b6001600160e01b03169695505050505050565b6001600160a01b03828116600081815260fe6020818152604080842080546065845282862054949093528787166001600160a01b03198416811790915590519190951694919391928592917f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a4611371828483611c72565b600063ffffffff8211156117055760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203360448201526532206269747360d01b6064820152608401610700565b5090565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6060609980546105a09061279b565b6060609a80546105a09061279b565b600065ffffffffffff8211156117055760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203460448201526538206269747360d01b6064820152608401610700565b6001600160a01b03821660008181526101326020908152604091829020805460ff191685151590811790915591519182527f72a561d1af7409467dae4f1e9fc52590a9335a1dda17727e2b6aa8c4db35109b91016112f1565b6000610637611846611533565b8360405161190160f01b8152600281019290925260228201526042902090565b600080600061187787878787611daf565b9150915061188481611e73565b5095945050505050565b6001600160a01b038116600090815260cb602052604090208054600181018255905b50919050565b600054610100900460ff166118dd5760405162461bcd60e51b815260040161070090612850565b610773611fbd565b600054610100900460ff1661190c5760405162461bcd60e51b815260040161070090612850565b61064f8282611fed565b600054610100900460ff1661193d5760405162461bcd60e51b815260040161070090612850565b61073c81604051806040016040528060018152602001603160f81b81525061202d565b61196a828261207c565b6067546001600160e01b0310156119dc5760405162461bcd60e51b815260206004820152603060248201527f4552433230566f7465733a20746f74616c20737570706c79207269736b73206f60448201526f766572666c6f77696e6720766f74657360801b6064820152608401610700565b6113716101006121518361215d565b610130544211611ac4576001600160a01b0383166000908152610131602052604090205460ff1680611a3657506001600160a01b0382166000908152610132602052604090205460ff165b80611a4857506001600160a01b038316155b611ac45760405162461bcd60e51b815260206004820152604160248201527f4261636b696e67456967656e2e5f6265666f7265546f6b656e5472616e73666560448201527f723a2066726f6d206f7220746f206d7573742062652077686974656c697374656064820152601960fa1b608482015260a401610700565b505050565b6001600160a01b03838116600090815260fe6020526040808220548584168352912054611ac492918216911683611c72565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611b266122d2565b611b2e61232b565b60408051602081019490945283019190915260608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b600081600003611b8157506000919050565b60006001611b8e8461235c565b901c6001901b90506001818481611ba757611ba761289b565b048201901c90506001818481611bbf57611bbf61289b565b048201901c90506001818481611bd757611bd761289b565b048201901c90506001818481611bef57611bef61289b565b048201901c90506001818481611c0757611c0761289b565b048201901c90506001818481611c1f57611c1f61289b565b048201901c90506001818481611c3757611c3761289b565b048201901c905061072b81828581611c5157611c5161289b565b046123f0565b6000611c6660028484186128b1565b61072b908484166127e5565b816001600160a01b0316836001600160a01b031614158015611c945750600081115b15611ac4576001600160a01b03831615611d22576001600160a01b038316600090815260ff602052604081208190611ccf906124068561215d565b91509150846001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051611d17929190918252602082015260400190565b60405180910390a250505b6001600160a01b03821615611ac4576001600160a01b038216600090815260ff602052604081208190611d58906121518561215d565b91509150836001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051611da0929190918252602082015260400190565b60405180910390a25050505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115611de65750600090506003611e6a565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015611e3a573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116611e6357600060019250925050611e6a565b9150600090505b94509492505050565b6000816004811115611e8757611e876128d3565b03611e8f5750565b6001816004811115611ea357611ea36128d3565b03611ef05760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610700565b6002816004811115611f0457611f046128d3565b03611f515760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610700565b6003816004811115611f6557611f656128d3565b0361073c5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610700565b600054610100900460ff16611fe45760405162461bcd60e51b815260040161070090612850565b61077333611709565b600054610100900460ff166120145760405162461bcd60e51b815260040161070090612850565b60686120208382612937565b506069611ac48282612937565b600054610100900460ff166120545760405162461bcd60e51b815260040161070090612850565b60996120608382612937565b50609a61206d8282612937565b50506000609781905560985550565b6001600160a01b0382166120d25760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610700565b6120de600083836119eb565b80606760008282546120f091906127e5565b90915550506001600160a01b0382166000818152606560209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a361064f60008383611ac9565b600061072b82846127e5565b825460009081908181156121aa5760008781526020902082016000190160408051808201909152905463ffffffff8116825264010000000090046001600160e01b031660208201526121bf565b60408051808201909152600080825260208201525b905080602001516001600160e01b031693506121df84868863ffffffff16565b925060008211801561220957506121f4610899565b65ffffffffffff16816000015163ffffffff16145b1561224e5761221783612412565b60008881526020902083016000190180546001600160e01b03929092166401000000000263ffffffff9092169190911790556122c8565b866040518060400160405280612272612265610899565b65ffffffffffff166116a0565b63ffffffff16815260200161228686612412565b6001600160e01b0390811690915282546001810184556000938452602093849020835194909301519091166401000000000263ffffffff909316929092179101555b5050935093915050565b6000806122dd61175b565b8051909150156122f4578051602090910120919050565b60975480156123035792915050565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4709250505090565b60008061233661176a565b80519091501561234d578051602090910120919050565b60985480156123035792915050565b600080608083901c1561237157608092831c92015b604083901c1561238357604092831c92015b602083901c1561239557602092831c92015b601083901c156123a757601092831c92015b600883901c156123b957600892831c92015b600483901c156123cb57600492831c92015b600283901c156123dd57600292831c92015b600183901c156106375760010192915050565b60008183106123ff578161072b565b5090919050565b600061072b828461283d565b60006001600160e01b038211156117055760405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e20326044820152663234206269747360c81b6064820152608401610700565b80356001600160a01b038116811461249257600080fd5b919050565b6000602082840312156124a957600080fd5b61072b8261247b565b6000815180845260005b818110156124d8576020818501810151868301820152016124bc565b506000602082860101526020601f19601f83011685010191505092915050565b60208152600061072b60208301846124b2565b6000806040838503121561251e57600080fd5b6125278361247b565b946020939093013593505050565b6000806040838503121561254857600080fd5b6125518361247b565b91506020830135801515811461256657600080fd5b809150509250929050565b60008060006060848603121561258657600080fd5b61258f8461247b565b925061259d6020850161247b565b929592945050506040919091013590565b60ff60f81b8816815260e0602082015260006125cd60e08301896124b2565b82810360408401526125df81896124b2565b606084018890526001600160a01b038716608085015260a0840186905283810360c08501528451808252602080870193509091019060005b81811015612635578351835260209384019390920191600101612617565b50909b9a5050505050505050505050565b60006020828403121561265857600080fd5b5035919050565b803560ff8116811461249257600080fd5b60008060008060008060c0878903121561268957600080fd5b6126928761247b565b955060208701359450604087013593506126ae6060880161265f565b9598949750929560808101359460a0909101359350915050565b600080600080600080600060e0888a0312156126e357600080fd5b6126ec8861247b565b96506126fa6020890161247b565b955060408801359450606088013593506127166080890161265f565b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561274657600080fd5b61274f8361247b565b915061275d6020840161247b565b90509250929050565b6000806040838503121561277957600080fd5b6127828361247b565b9150602083013563ffffffff8116811461256657600080fd5b600181811c908216806127af57607f821691505b6020821081036118b057634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b80820180821115610637576106376127cf565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b60006020828403121561283657600080fd5b5051919050565b81810381811115610637576106376127cf565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b634e487b7160e01b600052601260045260246000fd5b6000826128ce57634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052602160045260246000fd5b601f821115611ac457806000526020600020601f840160051c810160208510156129105750805b601f840160051c820191505b81811015612930576000815560010161291c565b5050505050565b815167ffffffffffffffff811115612951576129516127f8565b6129658161295f845461279b565b846128e9565b6020601f82116001811461299957600083156129815750848201515b600019600385901b1c1916600184901b178455612930565b600084815260208120601f198516915b828110156129c957878501518255602094850194600190920191016129a9565b50848210156129e75786840151600019600387901b60f8161c191681555b50505050600190811b0190555056fea2646970667358221220a833c1bf43f8dd9aa913a34b3793922c1db07371891e22d7c57ff48ff95faea764736f6c634300081b0033", } // BackingEigenABI is the input ABI used to generate the binding from. diff --git a/pkg/bindings/BeaconChainProofs/binding.go b/pkg/bindings/BeaconChainProofs/binding.go index 2fc7439ef..2b165ef8f 100644 --- a/pkg/bindings/BeaconChainProofs/binding.go +++ b/pkg/bindings/BeaconChainProofs/binding.go @@ -31,8 +31,8 @@ var ( // BeaconChainProofsMetaData contains all meta data concerning the BeaconChainProofs contract. var BeaconChainProofsMetaData = &bind.MetaData{ - ABI: "[]", - Bin: "0x60566037600b82828239805160001a607314602a57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea2646970667358221220c00cb22743991a146de10677177d34d77104039d759b6119b391bd5a11f1770f64736f6c634300080c0033", + ABI: "[{\"type\":\"error\",\"name\":\"InvalidProof\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidProofLength\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidValidatorFieldsLength\",\"inputs\":[]}]", + Bin: "0x60566037600b82828239805160001a607314602a57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea26469706673582212208a1eb51fb00c60eec27e6475590ffb72349f0d89ab6620fdb8296390a5a598a364736f6c634300081b0033", } // BeaconChainProofsABI is the input ABI used to generate the binding from. diff --git a/pkg/bindings/BytesLib/binding.go b/pkg/bindings/BytesLib/binding.go index b54665bad..b33bcba35 100644 --- a/pkg/bindings/BytesLib/binding.go +++ b/pkg/bindings/BytesLib/binding.go @@ -31,8 +31,8 @@ var ( // BytesLibMetaData contains all meta data concerning the BytesLib contract. var BytesLibMetaData = &bind.MetaData{ - ABI: "[]", - Bin: "0x60566037600b82828239805160001a607314602a57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea264697066735822122052491940b4b732c4bc716d1afbe1eaf5e1c77ff3a35e025bac5ca61a239df65964736f6c634300080c0033", + ABI: "[{\"type\":\"error\",\"name\":\"OutOfBounds\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"Overflow\",\"inputs\":[]}]", + Bin: "0x60566037600b82828239805160001a607314602a57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea26469706673582212205ea0bc58325986fdf7cfd187032954143e205626010fae5ce1c4e48de8d70f2164736f6c634300081b0033", } // BytesLibABI is the input ABI used to generate the binding from. diff --git a/pkg/bindings/Checkpoints/binding.go b/pkg/bindings/Checkpoints/binding.go new file mode 100644 index 000000000..41a27afa8 --- /dev/null +++ b/pkg/bindings/Checkpoints/binding.go @@ -0,0 +1,203 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package Checkpoints + +import ( + "errors" + "math/big" + "strings" + + ethereum "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/event" +) + +// Reference imports to suppress errors if they are not otherwise used. +var ( + _ = errors.New + _ = big.NewInt + _ = strings.NewReader + _ = ethereum.NotFound + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription + _ = abi.ConvertType +) + +// CheckpointsMetaData contains all meta data concerning the Checkpoints contract. +var CheckpointsMetaData = &bind.MetaData{ + ABI: "[]", + Bin: "0x60566037600b82828239805160001a607314602a57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea264697066735822122033cd598fba8494d1a6958a8af518adce5917043f9d96f1543c5e5350d9ce39b364736f6c634300080c0033", +} + +// CheckpointsABI is the input ABI used to generate the binding from. +// Deprecated: Use CheckpointsMetaData.ABI instead. +var CheckpointsABI = CheckpointsMetaData.ABI + +// CheckpointsBin is the compiled bytecode used for deploying new contracts. +// Deprecated: Use CheckpointsMetaData.Bin instead. +var CheckpointsBin = CheckpointsMetaData.Bin + +// DeployCheckpoints deploys a new Ethereum contract, binding an instance of Checkpoints to it. +func DeployCheckpoints(auth *bind.TransactOpts, backend bind.ContractBackend) (common.Address, *types.Transaction, *Checkpoints, error) { + parsed, err := CheckpointsMetaData.GetAbi() + if err != nil { + return common.Address{}, nil, nil, err + } + if parsed == nil { + return common.Address{}, nil, nil, errors.New("GetABI returned nil") + } + + address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(CheckpointsBin), backend) + if err != nil { + return common.Address{}, nil, nil, err + } + return address, tx, &Checkpoints{CheckpointsCaller: CheckpointsCaller{contract: contract}, CheckpointsTransactor: CheckpointsTransactor{contract: contract}, CheckpointsFilterer: CheckpointsFilterer{contract: contract}}, nil +} + +// Checkpoints is an auto generated Go binding around an Ethereum contract. +type Checkpoints struct { + CheckpointsCaller // Read-only binding to the contract + CheckpointsTransactor // Write-only binding to the contract + CheckpointsFilterer // Log filterer for contract events +} + +// CheckpointsCaller is an auto generated read-only Go binding around an Ethereum contract. +type CheckpointsCaller struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// CheckpointsTransactor is an auto generated write-only Go binding around an Ethereum contract. +type CheckpointsTransactor struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// CheckpointsFilterer is an auto generated log filtering Go binding around an Ethereum contract events. +type CheckpointsFilterer struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// CheckpointsSession is an auto generated Go binding around an Ethereum contract, +// with pre-set call and transact options. +type CheckpointsSession struct { + Contract *Checkpoints // Generic contract binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// CheckpointsCallerSession is an auto generated read-only Go binding around an Ethereum contract, +// with pre-set call options. +type CheckpointsCallerSession struct { + Contract *CheckpointsCaller // Generic contract caller binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session +} + +// CheckpointsTransactorSession is an auto generated write-only Go binding around an Ethereum contract, +// with pre-set transact options. +type CheckpointsTransactorSession struct { + Contract *CheckpointsTransactor // Generic contract transactor binding to set the session for + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// CheckpointsRaw is an auto generated low-level Go binding around an Ethereum contract. +type CheckpointsRaw struct { + Contract *Checkpoints // Generic contract binding to access the raw methods on +} + +// CheckpointsCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. +type CheckpointsCallerRaw struct { + Contract *CheckpointsCaller // Generic read-only contract binding to access the raw methods on +} + +// CheckpointsTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. +type CheckpointsTransactorRaw struct { + Contract *CheckpointsTransactor // Generic write-only contract binding to access the raw methods on +} + +// NewCheckpoints creates a new instance of Checkpoints, bound to a specific deployed contract. +func NewCheckpoints(address common.Address, backend bind.ContractBackend) (*Checkpoints, error) { + contract, err := bindCheckpoints(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &Checkpoints{CheckpointsCaller: CheckpointsCaller{contract: contract}, CheckpointsTransactor: CheckpointsTransactor{contract: contract}, CheckpointsFilterer: CheckpointsFilterer{contract: contract}}, nil +} + +// NewCheckpointsCaller creates a new read-only instance of Checkpoints, bound to a specific deployed contract. +func NewCheckpointsCaller(address common.Address, caller bind.ContractCaller) (*CheckpointsCaller, error) { + contract, err := bindCheckpoints(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &CheckpointsCaller{contract: contract}, nil +} + +// NewCheckpointsTransactor creates a new write-only instance of Checkpoints, bound to a specific deployed contract. +func NewCheckpointsTransactor(address common.Address, transactor bind.ContractTransactor) (*CheckpointsTransactor, error) { + contract, err := bindCheckpoints(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &CheckpointsTransactor{contract: contract}, nil +} + +// NewCheckpointsFilterer creates a new log filterer instance of Checkpoints, bound to a specific deployed contract. +func NewCheckpointsFilterer(address common.Address, filterer bind.ContractFilterer) (*CheckpointsFilterer, error) { + contract, err := bindCheckpoints(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &CheckpointsFilterer{contract: contract}, nil +} + +// bindCheckpoints binds a generic wrapper to an already deployed contract. +func bindCheckpoints(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := CheckpointsMetaData.GetAbi() + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_Checkpoints *CheckpointsRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _Checkpoints.Contract.CheckpointsCaller.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_Checkpoints *CheckpointsRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _Checkpoints.Contract.CheckpointsTransactor.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_Checkpoints *CheckpointsRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _Checkpoints.Contract.CheckpointsTransactor.contract.Transact(opts, method, params...) +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_Checkpoints *CheckpointsCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _Checkpoints.Contract.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_Checkpoints *CheckpointsTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _Checkpoints.Contract.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_Checkpoints *CheckpointsTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _Checkpoints.Contract.contract.Transact(opts, method, params...) +} diff --git a/pkg/bindings/DelayedWithdrawalRouter/binding.go b/pkg/bindings/DelayedWithdrawalRouter/binding.go new file mode 100644 index 000000000..4943de658 --- /dev/null +++ b/pkg/bindings/DelayedWithdrawalRouter/binding.go @@ -0,0 +1,1969 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package DelayedWithdrawalRouter + +import ( + "errors" + "math/big" + "strings" + + ethereum "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/event" +) + +// Reference imports to suppress errors if they are not otherwise used. +var ( + _ = errors.New + _ = big.NewInt + _ = strings.NewReader + _ = ethereum.NotFound + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription + _ = abi.ConvertType +) + +// IDelayedWithdrawalRouterDelayedWithdrawal is an auto generated low-level Go binding around an user-defined struct. +type IDelayedWithdrawalRouterDelayedWithdrawal struct { + Amount *big.Int + BlockCreated uint32 +} + +// IDelayedWithdrawalRouterUserDelayedWithdrawals is an auto generated low-level Go binding around an user-defined struct. +type IDelayedWithdrawalRouterUserDelayedWithdrawals struct { + DelayedWithdrawalsCompleted *big.Int + DelayedWithdrawals []IDelayedWithdrawalRouterDelayedWithdrawal +} + +// DelayedWithdrawalRouterMetaData contains all meta data concerning the DelayedWithdrawalRouter contract. +var DelayedWithdrawalRouterMetaData = &bind.MetaData{ + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_eigenPodManager\",\"type\":\"address\",\"internalType\":\"contractIEigenPodManager\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"MAX_WITHDRAWAL_DELAY_BLOCKS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"canClaimDelayedWithdrawal\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"index\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"claimDelayedWithdrawals\",\"inputs\":[{\"name\":\"maxNumberOfDelayedWithdrawalsToClaim\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"claimDelayedWithdrawals\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"maxNumberOfDelayedWithdrawalsToClaim\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"createDelayedWithdrawal\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"eigenPodManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigenPodManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getClaimableUserDelayedWithdrawals\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structIDelayedWithdrawalRouter.DelayedWithdrawal[]\",\"components\":[{\"name\":\"amount\",\"type\":\"uint224\",\"internalType\":\"uint224\"},{\"name\":\"blockCreated\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getUserDelayedWithdrawals\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structIDelayedWithdrawalRouter.DelayedWithdrawal[]\",\"components\":[{\"name\":\"amount\",\"type\":\"uint224\",\"internalType\":\"uint224\"},{\"name\":\"blockCreated\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"initPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_withdrawalDelayBlocks\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setPauserRegistry\",\"inputs\":[{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setWithdrawalDelayBlocks\",\"inputs\":[{\"name\":\"newValue\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"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\":\"userDelayedWithdrawalByIndex\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"index\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIDelayedWithdrawalRouter.DelayedWithdrawal\",\"components\":[{\"name\":\"amount\",\"type\":\"uint224\",\"internalType\":\"uint224\"},{\"name\":\"blockCreated\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"userWithdrawals\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIDelayedWithdrawalRouter.UserDelayedWithdrawals\",\"components\":[{\"name\":\"delayedWithdrawalsCompleted\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"delayedWithdrawals\",\"type\":\"tuple[]\",\"internalType\":\"structIDelayedWithdrawalRouter.DelayedWithdrawal[]\",\"components\":[{\"name\":\"amount\",\"type\":\"uint224\",\"internalType\":\"uint224\"},{\"name\":\"blockCreated\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"userWithdrawalsLength\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"withdrawalDelayBlocks\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"DelayedWithdrawalCreated\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"index\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelayedWithdrawalsClaimed\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"amountClaimed\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"delayedWithdrawalsCompleted\",\"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\":\"PauserRegistrySet\",\"inputs\":[{\"name\":\"pauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"WithdrawalDelayBlocksSet\",\"inputs\":[{\"name\":\"previousValue\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"newValue\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false}]", + Bin: "0x60a06040523480156200001157600080fd5b5060405162001f0e38038062001f0e8339810160408190526200003491620001a8565b6001600160a01b038116620000cb5760405162461bcd60e51b815260206004820152604c60248201527f44656c617965645769746864726177616c526f757465722e636f6e737472756360448201527f746f723a205f656967656e506f644d616e616765722063616e6e6f742062652060648201526b7a65726f206164647265737360a01b608482015260a4015b60405180910390fd5b6001600160a01b038116608052620000e2620000e9565b50620001da565b600054610100900460ff1615620001535760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b6064820152608401620000c2565b60005460ff9081161015620001a6576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b600060208284031215620001bb57600080fd5b81516001600160a01b0381168114620001d357600080fd5b9392505050565b608051611d11620001fd600039600081816101fa0152610c000152611d116000f3fe60806040526004361061014b5760003560e01c806385594e58116100b6578063e4f4f8871161006f578063e4f4f887146103cc578063e5db06c014610405578063eb990c5914610425578063ecb7cb1b14610445578063f2fde38b14610472578063fabc1cbc1461049257600080fd5b806385594e5814610317578063886f1195146103445780638da5cb5b14610364578063c0db354c14610382578063ca661c0414610395578063d44e1b76146103ac57600080fd5b806350f73e7c1161010857806350f73e7c14610254578063595c6a67146102785780635ac86ab71461028d5780635c975abb146102cd578063715018a6146102e257806375608896146102f757600080fd5b806310d67a2f14610150578063136439dd146101725780631f39d87f146101925780633e1de008146101c85780634665bcda146101e85780634d50f9a414610234575b600080fd5b34801561015c57600080fd5b5061017061016b36600461196d565b6104b2565b005b34801561017e57600080fd5b5061017061018d366004611991565b61056e565b34801561019e57600080fd5b506101b26101ad36600461196d565b6106ad565b6040516101bf91906119c8565b60405180910390f35b3480156101d457600080fd5b506101b26101e336600461196d565b6108a8565b3480156101f457600080fd5b5061021c7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016101bf565b34801561024057600080fd5b5061017061024f366004611991565b6109ee565b34801561026057600080fd5b5061026a60c95481565b6040519081526020016101bf565b34801561028457600080fd5b506101706109ff565b34801561029957600080fd5b506102bd6102a8366004611a15565b609854600160ff9092169190911b9081161490565b60405190151581526020016101bf565b3480156102d957600080fd5b5060985461026a565b3480156102ee57600080fd5b50610170610ac6565b34801561030357600080fd5b506102bd610312366004611a38565b610ada565b34801561032357600080fd5b50610337610332366004611a38565b610b5d565b6040516101bf9190611a64565b34801561035057600080fd5b5060975461021c906001600160a01b031681565b34801561037057600080fd5b506033546001600160a01b031661021c565b610170610390366004611a72565b610bdd565b3480156103a157600080fd5b5061026a62034bc081565b3480156103b857600080fd5b506101706103c7366004611991565b610e9d565b3480156103d857600080fd5b5061026a6103e736600461196d565b6001600160a01b0316600090815260ca602052604090206001015490565b34801561041157600080fd5b50610170610420366004611a38565b610f31565b34801561043157600080fd5b50610170610440366004611aab565b610fc6565b34801561045157600080fd5b5061046561046036600461196d565b6110ee565b6040516101bf9190611af1565b34801561047e57600080fd5b5061017061048d36600461196d565b6111a8565b34801561049e57600080fd5b506101706104ad366004611991565b61121e565b609760009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610505573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105299190611b47565b6001600160a01b0316336001600160a01b0316146105625760405162461bcd60e51b815260040161055990611b64565b60405180910390fd5b61056b8161137a565b50565b60975460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa1580156105b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105da9190611bae565b6105f65760405162461bcd60e51b815260040161055990611bd0565b6098548181161461066f5760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c69747900000000000000006064820152608401610559565b609881905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b6001600160a01b038116600090815260ca6020526040812080546001909101546060926106da8383611c2e565b90508060005b82811015610786576001600160a01b038716600090815260ca6020526040812060010161070d8388611c45565b8154811061071d5761071d611c5d565b6000918252602091829020604080518082019091529101546001600160e01b0381168252600160e01b900463ffffffff1691810182905260c95490925061076391611c45565b4310156107735781925050610786565b508061077e81611c73565b9150506106e0565b508060008167ffffffffffffffff8111156107a3576107a3611c8e565b6040519080825280602002602001820160405280156107e857816020015b60408051808201909152600080825260208201528152602001906001900390816107c15790505b509050811561089d5760005b8281101561089b576001600160a01b038916600090815260ca602052604090206001016108218289611c45565b8154811061083157610831611c5d565b6000918252602091829020604080518082019091529101546001600160e01b0381168252600160e01b900463ffffffff1691810191909152825183908390811061087d5761087d611c5d565b6020026020010181905250808061089390611c73565b9150506107f4565b505b979650505050505050565b6001600160a01b038116600090815260ca6020526040812080546001909101546060926108d58383611c2e565b905060008167ffffffffffffffff8111156108f2576108f2611c8e565b60405190808252806020026020018201604052801561093757816020015b60408051808201909152600080825260208201528152602001906001900390816109105790505b50905060005b828110156109e4576001600160a01b038716600090815260ca6020526040902060010161096a8287611c45565b8154811061097a5761097a611c5d565b6000918252602091829020604080518082019091529101546001600160e01b0381168252600160e01b900463ffffffff169181019190915282518390839081106109c6576109c6611c5d565b602002602001018190525080806109dc90611c73565b91505061093d565b5095945050505050565b6109f6611471565b61056b816114cb565b60975460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015610a47573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a6b9190611bae565b610a875760405162461bcd60e51b815260040161055990611bd0565b600019609881905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b610ace611471565b610ad86000611593565b565b6001600160a01b038216600090815260ca60205260408120548210801590610b54575060c9546001600160a01b038416600090815260ca60205260409020600101805484908110610b2d57610b2d611c5d565b600091825260209091200154610b509190600160e01b900463ffffffff16611c45565b4310155b90505b92915050565b60408051808201909152600080825260208201526001600160a01b038316600090815260ca60205260409020600101805483908110610b9e57610b9e611c5d565b6000918252602091829020604080518082019091529101546001600160e01b0381168252600160e01b900463ffffffff16918101919091529392505050565b60405163a38406a360e01b81526001600160a01b038084166004830152839133917f0000000000000000000000000000000000000000000000000000000000000000169063a38406a390602401602060405180830381865afa158015610c47573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c6b9190611b47565b6001600160a01b031614610ce75760405162461bcd60e51b815260206004820152603d60248201527f44656c617965645769746864726177616c526f757465722e6f6e6c794569676560448201527f6e506f643a206e6f7420706f644f776e6572277320456967656e506f640000006064820152608401610559565b60985460009060019081161415610d105760405162461bcd60e51b815260040161055990611ca4565b6001600160a01b038316610da65760405162461bcd60e51b815260206004820152605160248201527f44656c617965645769746864726177616c526f757465722e637265617465446560448201527f6c617965645769746864726177616c3a20726563697069656e742063616e6e6f60648201527074206265207a65726f206164647265737360781b608482015260a401610559565b346001600160e01b03811615610e96576040805180820182526001600160e01b03808416825263ffffffff43811660208085019182526001600160a01b038a16600081815260ca8352968720600190810180548083018255818a5293892088519551909616600160e01b029490961693909317939091019290925593525490917fb8f1b14c7caf74150801dcc9bc18d575cbeaf5b421943497e409df92c92e0f5991889188918691610e5791611c2e565b604080516001600160a01b0395861681529490931660208501526001600160e01b039091169183019190915260608201526080015b60405180910390a1505b5050505050565b60026065541415610ef05760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610559565b600260655560985460009060019081161415610f1e5760405162461bcd60e51b815260040161055990611ca4565b610f2833836115e5565b50506001606555565b60026065541415610f845760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610559565b600260655560985460009060019081161415610fb25760405162461bcd60e51b815260040161055990611ca4565b610fbc83836115e5565b5050600160655550565b600054610100900460ff1615808015610fe65750600054600160ff909116105b806110005750303b158015611000575060005460ff166001145b6110635760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610559565b6000805460ff191660011790558015611086576000805461ff0019166101001790555b61108f85611593565b6110998484611750565b6110a2826114cb565b8015610e96576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050505050565b6040805180820190915260008152606060208201526001600160a01b038216600090815260ca6020908152604080832081518083018352815481526001820180548451818702810187019095528085529195929486810194939192919084015b8282101561119a57600084815260209081902060408051808201909152908401546001600160e01b0381168252600160e01b900463ffffffff168183015282526001909201910161114e565b505050915250909392505050565b6111b0611471565b6001600160a01b0381166112155760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610559565b61056b81611593565b609760009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611271573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112959190611b47565b6001600160a01b0316336001600160a01b0316146112c55760405162461bcd60e51b815260040161055990611b64565b6098541981196098541916146113435760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c69747900000000000000006064820152608401610559565b609881905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c906020016106a2565b6001600160a01b0381166114085760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a401610559565b609754604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1609780546001600160a01b0319166001600160a01b0392909216919091179055565b6033546001600160a01b03163314610ad85760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610559565b62034bc08111156115525760405162461bcd60e51b815260206004820152604560248201527f44656c617965645769746864726177616c526f757465722e5f7365745769746860448201527f64726177616c44656c6179426c6f636b733a206e657756616c756520746f6f206064820152646c6172676560d81b608482015260a401610559565b60c95460408051918252602082018390527f4ffb00400574147429ee377a5633386321e66d45d8b14676014b5fa393e61e9e910160405180910390a160c955565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038216600090815260ca602052604081208054600190910154825b848110801561161e57508161161c8285611c45565b105b156116cb576001600160a01b038616600090815260ca602052604081206001016116488386611c45565b8154811061165857611658611c5d565b6000918252602091829020604080518082019091529101546001600160e01b0381168252600160e01b900463ffffffff1691810182905260c95490925061169e91611c45565b4310156116ab57506116cb565b80516116c0906001600160e01b031686611c45565b945050600101611607565b6116d58184611c45565b6001600160a01b038716600090815260ca602052604090205583156116fe576116fe868561183a565b7f6b7151500bd0b5cc211bcc47b3029831b769004df4549e8e1c9a69da05bb0943868561172b8487611c45565b604080516001600160a01b039094168452602084019290925290820152606001610e8c565b6097546001600160a01b031615801561177157506001600160a01b03821615155b6117f35760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a401610559565b609881905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a26118368261137a565b5050565b8047101561188a5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610559565b6000826001600160a01b03168260405160006040518083038185875af1925050503d80600081146118d7576040519150601f19603f3d011682016040523d82523d6000602084013e6118dc565b606091505b50509050806119535760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610559565b505050565b6001600160a01b038116811461056b57600080fd5b60006020828403121561197f57600080fd5b813561198a81611958565b9392505050565b6000602082840312156119a357600080fd5b5035919050565b80516001600160e01b0316825260209081015163ffffffff16910152565b602080825282518282018190526000919060409081850190868401855b82811015611a08576119f88483516119aa565b92840192908501906001016119e5565b5091979650505050505050565b600060208284031215611a2757600080fd5b813560ff8116811461198a57600080fd5b60008060408385031215611a4b57600080fd5b8235611a5681611958565b946020939093013593505050565b60408101610b5782846119aa565b60008060408385031215611a8557600080fd5b8235611a9081611958565b91506020830135611aa081611958565b809150509250929050565b60008060008060808587031215611ac157600080fd5b8435611acc81611958565b93506020850135611adc81611958565b93969395505050506040820135916060013590565b602080825282518282015282810151604080840181905281516060850181905260009392830191849160808701905b8084101561089b57611b338286516119aa565b938501936001939093019290820190611b20565b600060208284031215611b5957600080fd5b815161198a81611958565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b600060208284031215611bc057600080fd5b8151801515811461198a57600080fd5b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b600082821015611c4057611c40611c18565b500390565b60008219821115611c5857611c58611c18565b500190565b634e487b7160e01b600052603260045260246000fd5b6000600019821415611c8757611c87611c18565b5060010190565b634e487b7160e01b600052604160045260246000fd5b60208082526019908201527f5061757361626c653a20696e646578206973207061757365640000000000000060408201526060019056fea264697066735822122005b0ecc66b0468e43c0d5b0ff9c7b1e449b7556e61ae26d108ff696ed83f730364736f6c634300080c0033", +} + +// DelayedWithdrawalRouterABI is the input ABI used to generate the binding from. +// Deprecated: Use DelayedWithdrawalRouterMetaData.ABI instead. +var DelayedWithdrawalRouterABI = DelayedWithdrawalRouterMetaData.ABI + +// DelayedWithdrawalRouterBin is the compiled bytecode used for deploying new contracts. +// Deprecated: Use DelayedWithdrawalRouterMetaData.Bin instead. +var DelayedWithdrawalRouterBin = DelayedWithdrawalRouterMetaData.Bin + +// DeployDelayedWithdrawalRouter deploys a new Ethereum contract, binding an instance of DelayedWithdrawalRouter to it. +func DeployDelayedWithdrawalRouter(auth *bind.TransactOpts, backend bind.ContractBackend, _eigenPodManager common.Address) (common.Address, *types.Transaction, *DelayedWithdrawalRouter, error) { + parsed, err := DelayedWithdrawalRouterMetaData.GetAbi() + if err != nil { + return common.Address{}, nil, nil, err + } + if parsed == nil { + return common.Address{}, nil, nil, errors.New("GetABI returned nil") + } + + address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(DelayedWithdrawalRouterBin), backend, _eigenPodManager) + if err != nil { + return common.Address{}, nil, nil, err + } + return address, tx, &DelayedWithdrawalRouter{DelayedWithdrawalRouterCaller: DelayedWithdrawalRouterCaller{contract: contract}, DelayedWithdrawalRouterTransactor: DelayedWithdrawalRouterTransactor{contract: contract}, DelayedWithdrawalRouterFilterer: DelayedWithdrawalRouterFilterer{contract: contract}}, nil +} + +// DelayedWithdrawalRouter is an auto generated Go binding around an Ethereum contract. +type DelayedWithdrawalRouter struct { + DelayedWithdrawalRouterCaller // Read-only binding to the contract + DelayedWithdrawalRouterTransactor // Write-only binding to the contract + DelayedWithdrawalRouterFilterer // Log filterer for contract events +} + +// DelayedWithdrawalRouterCaller is an auto generated read-only Go binding around an Ethereum contract. +type DelayedWithdrawalRouterCaller struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// DelayedWithdrawalRouterTransactor is an auto generated write-only Go binding around an Ethereum contract. +type DelayedWithdrawalRouterTransactor struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// DelayedWithdrawalRouterFilterer is an auto generated log filtering Go binding around an Ethereum contract events. +type DelayedWithdrawalRouterFilterer struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// DelayedWithdrawalRouterSession is an auto generated Go binding around an Ethereum contract, +// with pre-set call and transact options. +type DelayedWithdrawalRouterSession struct { + Contract *DelayedWithdrawalRouter // Generic contract binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// DelayedWithdrawalRouterCallerSession is an auto generated read-only Go binding around an Ethereum contract, +// with pre-set call options. +type DelayedWithdrawalRouterCallerSession struct { + Contract *DelayedWithdrawalRouterCaller // Generic contract caller binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session +} + +// DelayedWithdrawalRouterTransactorSession is an auto generated write-only Go binding around an Ethereum contract, +// with pre-set transact options. +type DelayedWithdrawalRouterTransactorSession struct { + Contract *DelayedWithdrawalRouterTransactor // Generic contract transactor binding to set the session for + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// DelayedWithdrawalRouterRaw is an auto generated low-level Go binding around an Ethereum contract. +type DelayedWithdrawalRouterRaw struct { + Contract *DelayedWithdrawalRouter // Generic contract binding to access the raw methods on +} + +// DelayedWithdrawalRouterCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. +type DelayedWithdrawalRouterCallerRaw struct { + Contract *DelayedWithdrawalRouterCaller // Generic read-only contract binding to access the raw methods on +} + +// DelayedWithdrawalRouterTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. +type DelayedWithdrawalRouterTransactorRaw struct { + Contract *DelayedWithdrawalRouterTransactor // Generic write-only contract binding to access the raw methods on +} + +// NewDelayedWithdrawalRouter creates a new instance of DelayedWithdrawalRouter, bound to a specific deployed contract. +func NewDelayedWithdrawalRouter(address common.Address, backend bind.ContractBackend) (*DelayedWithdrawalRouter, error) { + contract, err := bindDelayedWithdrawalRouter(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &DelayedWithdrawalRouter{DelayedWithdrawalRouterCaller: DelayedWithdrawalRouterCaller{contract: contract}, DelayedWithdrawalRouterTransactor: DelayedWithdrawalRouterTransactor{contract: contract}, DelayedWithdrawalRouterFilterer: DelayedWithdrawalRouterFilterer{contract: contract}}, nil +} + +// NewDelayedWithdrawalRouterCaller creates a new read-only instance of DelayedWithdrawalRouter, bound to a specific deployed contract. +func NewDelayedWithdrawalRouterCaller(address common.Address, caller bind.ContractCaller) (*DelayedWithdrawalRouterCaller, error) { + contract, err := bindDelayedWithdrawalRouter(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &DelayedWithdrawalRouterCaller{contract: contract}, nil +} + +// NewDelayedWithdrawalRouterTransactor creates a new write-only instance of DelayedWithdrawalRouter, bound to a specific deployed contract. +func NewDelayedWithdrawalRouterTransactor(address common.Address, transactor bind.ContractTransactor) (*DelayedWithdrawalRouterTransactor, error) { + contract, err := bindDelayedWithdrawalRouter(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &DelayedWithdrawalRouterTransactor{contract: contract}, nil +} + +// NewDelayedWithdrawalRouterFilterer creates a new log filterer instance of DelayedWithdrawalRouter, bound to a specific deployed contract. +func NewDelayedWithdrawalRouterFilterer(address common.Address, filterer bind.ContractFilterer) (*DelayedWithdrawalRouterFilterer, error) { + contract, err := bindDelayedWithdrawalRouter(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &DelayedWithdrawalRouterFilterer{contract: contract}, nil +} + +// bindDelayedWithdrawalRouter binds a generic wrapper to an already deployed contract. +func bindDelayedWithdrawalRouter(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := DelayedWithdrawalRouterMetaData.GetAbi() + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _DelayedWithdrawalRouter.Contract.DelayedWithdrawalRouterCaller.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _DelayedWithdrawalRouter.Contract.DelayedWithdrawalRouterTransactor.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _DelayedWithdrawalRouter.Contract.DelayedWithdrawalRouterTransactor.contract.Transact(opts, method, params...) +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _DelayedWithdrawalRouter.Contract.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _DelayedWithdrawalRouter.Contract.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _DelayedWithdrawalRouter.Contract.contract.Transact(opts, method, params...) +} + +// MAXWITHDRAWALDELAYBLOCKS is a free data retrieval call binding the contract method 0xca661c04. +// +// Solidity: function MAX_WITHDRAWAL_DELAY_BLOCKS() view returns(uint256) +func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterCaller) MAXWITHDRAWALDELAYBLOCKS(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _DelayedWithdrawalRouter.contract.Call(opts, &out, "MAX_WITHDRAWAL_DELAY_BLOCKS") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// MAXWITHDRAWALDELAYBLOCKS is a free data retrieval call binding the contract method 0xca661c04. +// +// Solidity: function MAX_WITHDRAWAL_DELAY_BLOCKS() view returns(uint256) +func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterSession) MAXWITHDRAWALDELAYBLOCKS() (*big.Int, error) { + return _DelayedWithdrawalRouter.Contract.MAXWITHDRAWALDELAYBLOCKS(&_DelayedWithdrawalRouter.CallOpts) +} + +// MAXWITHDRAWALDELAYBLOCKS is a free data retrieval call binding the contract method 0xca661c04. +// +// Solidity: function MAX_WITHDRAWAL_DELAY_BLOCKS() view returns(uint256) +func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterCallerSession) MAXWITHDRAWALDELAYBLOCKS() (*big.Int, error) { + return _DelayedWithdrawalRouter.Contract.MAXWITHDRAWALDELAYBLOCKS(&_DelayedWithdrawalRouter.CallOpts) +} + +// CanClaimDelayedWithdrawal is a free data retrieval call binding the contract method 0x75608896. +// +// Solidity: function canClaimDelayedWithdrawal(address user, uint256 index) view returns(bool) +func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterCaller) CanClaimDelayedWithdrawal(opts *bind.CallOpts, user common.Address, index *big.Int) (bool, error) { + var out []interface{} + err := _DelayedWithdrawalRouter.contract.Call(opts, &out, "canClaimDelayedWithdrawal", user, index) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +// CanClaimDelayedWithdrawal is a free data retrieval call binding the contract method 0x75608896. +// +// Solidity: function canClaimDelayedWithdrawal(address user, uint256 index) view returns(bool) +func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterSession) CanClaimDelayedWithdrawal(user common.Address, index *big.Int) (bool, error) { + return _DelayedWithdrawalRouter.Contract.CanClaimDelayedWithdrawal(&_DelayedWithdrawalRouter.CallOpts, user, index) +} + +// CanClaimDelayedWithdrawal is a free data retrieval call binding the contract method 0x75608896. +// +// Solidity: function canClaimDelayedWithdrawal(address user, uint256 index) view returns(bool) +func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterCallerSession) CanClaimDelayedWithdrawal(user common.Address, index *big.Int) (bool, error) { + return _DelayedWithdrawalRouter.Contract.CanClaimDelayedWithdrawal(&_DelayedWithdrawalRouter.CallOpts, user, index) +} + +// EigenPodManager is a free data retrieval call binding the contract method 0x4665bcda. +// +// Solidity: function eigenPodManager() view returns(address) +func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterCaller) EigenPodManager(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _DelayedWithdrawalRouter.contract.Call(opts, &out, "eigenPodManager") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// EigenPodManager is a free data retrieval call binding the contract method 0x4665bcda. +// +// Solidity: function eigenPodManager() view returns(address) +func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterSession) EigenPodManager() (common.Address, error) { + return _DelayedWithdrawalRouter.Contract.EigenPodManager(&_DelayedWithdrawalRouter.CallOpts) +} + +// EigenPodManager is a free data retrieval call binding the contract method 0x4665bcda. +// +// Solidity: function eigenPodManager() view returns(address) +func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterCallerSession) EigenPodManager() (common.Address, error) { + return _DelayedWithdrawalRouter.Contract.EigenPodManager(&_DelayedWithdrawalRouter.CallOpts) +} + +// GetClaimableUserDelayedWithdrawals is a free data retrieval call binding the contract method 0x1f39d87f. +// +// Solidity: function getClaimableUserDelayedWithdrawals(address user) view returns((uint224,uint32)[]) +func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterCaller) GetClaimableUserDelayedWithdrawals(opts *bind.CallOpts, user common.Address) ([]IDelayedWithdrawalRouterDelayedWithdrawal, error) { + var out []interface{} + err := _DelayedWithdrawalRouter.contract.Call(opts, &out, "getClaimableUserDelayedWithdrawals", user) + + if err != nil { + return *new([]IDelayedWithdrawalRouterDelayedWithdrawal), err + } + + out0 := *abi.ConvertType(out[0], new([]IDelayedWithdrawalRouterDelayedWithdrawal)).(*[]IDelayedWithdrawalRouterDelayedWithdrawal) + + return out0, err + +} + +// GetClaimableUserDelayedWithdrawals is a free data retrieval call binding the contract method 0x1f39d87f. +// +// Solidity: function getClaimableUserDelayedWithdrawals(address user) view returns((uint224,uint32)[]) +func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterSession) GetClaimableUserDelayedWithdrawals(user common.Address) ([]IDelayedWithdrawalRouterDelayedWithdrawal, error) { + return _DelayedWithdrawalRouter.Contract.GetClaimableUserDelayedWithdrawals(&_DelayedWithdrawalRouter.CallOpts, user) +} + +// GetClaimableUserDelayedWithdrawals is a free data retrieval call binding the contract method 0x1f39d87f. +// +// Solidity: function getClaimableUserDelayedWithdrawals(address user) view returns((uint224,uint32)[]) +func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterCallerSession) GetClaimableUserDelayedWithdrawals(user common.Address) ([]IDelayedWithdrawalRouterDelayedWithdrawal, error) { + return _DelayedWithdrawalRouter.Contract.GetClaimableUserDelayedWithdrawals(&_DelayedWithdrawalRouter.CallOpts, user) +} + +// GetUserDelayedWithdrawals is a free data retrieval call binding the contract method 0x3e1de008. +// +// Solidity: function getUserDelayedWithdrawals(address user) view returns((uint224,uint32)[]) +func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterCaller) GetUserDelayedWithdrawals(opts *bind.CallOpts, user common.Address) ([]IDelayedWithdrawalRouterDelayedWithdrawal, error) { + var out []interface{} + err := _DelayedWithdrawalRouter.contract.Call(opts, &out, "getUserDelayedWithdrawals", user) + + if err != nil { + return *new([]IDelayedWithdrawalRouterDelayedWithdrawal), err + } + + out0 := *abi.ConvertType(out[0], new([]IDelayedWithdrawalRouterDelayedWithdrawal)).(*[]IDelayedWithdrawalRouterDelayedWithdrawal) + + return out0, err + +} + +// GetUserDelayedWithdrawals is a free data retrieval call binding the contract method 0x3e1de008. +// +// Solidity: function getUserDelayedWithdrawals(address user) view returns((uint224,uint32)[]) +func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterSession) GetUserDelayedWithdrawals(user common.Address) ([]IDelayedWithdrawalRouterDelayedWithdrawal, error) { + return _DelayedWithdrawalRouter.Contract.GetUserDelayedWithdrawals(&_DelayedWithdrawalRouter.CallOpts, user) +} + +// GetUserDelayedWithdrawals is a free data retrieval call binding the contract method 0x3e1de008. +// +// Solidity: function getUserDelayedWithdrawals(address user) view returns((uint224,uint32)[]) +func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterCallerSession) GetUserDelayedWithdrawals(user common.Address) ([]IDelayedWithdrawalRouterDelayedWithdrawal, error) { + return _DelayedWithdrawalRouter.Contract.GetUserDelayedWithdrawals(&_DelayedWithdrawalRouter.CallOpts, user) +} + +// Owner is a free data retrieval call binding the contract method 0x8da5cb5b. +// +// Solidity: function owner() view returns(address) +func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterCaller) Owner(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _DelayedWithdrawalRouter.contract.Call(opts, &out, "owner") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// Owner is a free data retrieval call binding the contract method 0x8da5cb5b. +// +// Solidity: function owner() view returns(address) +func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterSession) Owner() (common.Address, error) { + return _DelayedWithdrawalRouter.Contract.Owner(&_DelayedWithdrawalRouter.CallOpts) +} + +// Owner is a free data retrieval call binding the contract method 0x8da5cb5b. +// +// Solidity: function owner() view returns(address) +func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterCallerSession) Owner() (common.Address, error) { + return _DelayedWithdrawalRouter.Contract.Owner(&_DelayedWithdrawalRouter.CallOpts) +} + +// Paused is a free data retrieval call binding the contract method 0x5ac86ab7. +// +// Solidity: function paused(uint8 index) view returns(bool) +func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterCaller) Paused(opts *bind.CallOpts, index uint8) (bool, error) { + var out []interface{} + err := _DelayedWithdrawalRouter.contract.Call(opts, &out, "paused", index) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +// Paused is a free data retrieval call binding the contract method 0x5ac86ab7. +// +// Solidity: function paused(uint8 index) view returns(bool) +func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterSession) Paused(index uint8) (bool, error) { + return _DelayedWithdrawalRouter.Contract.Paused(&_DelayedWithdrawalRouter.CallOpts, index) +} + +// Paused is a free data retrieval call binding the contract method 0x5ac86ab7. +// +// Solidity: function paused(uint8 index) view returns(bool) +func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterCallerSession) Paused(index uint8) (bool, error) { + return _DelayedWithdrawalRouter.Contract.Paused(&_DelayedWithdrawalRouter.CallOpts, index) +} + +// Paused0 is a free data retrieval call binding the contract method 0x5c975abb. +// +// Solidity: function paused() view returns(uint256) +func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterCaller) Paused0(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _DelayedWithdrawalRouter.contract.Call(opts, &out, "paused0") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// Paused0 is a free data retrieval call binding the contract method 0x5c975abb. +// +// Solidity: function paused() view returns(uint256) +func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterSession) Paused0() (*big.Int, error) { + return _DelayedWithdrawalRouter.Contract.Paused0(&_DelayedWithdrawalRouter.CallOpts) +} + +// Paused0 is a free data retrieval call binding the contract method 0x5c975abb. +// +// Solidity: function paused() view returns(uint256) +func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterCallerSession) Paused0() (*big.Int, error) { + return _DelayedWithdrawalRouter.Contract.Paused0(&_DelayedWithdrawalRouter.CallOpts) +} + +// PauserRegistry is a free data retrieval call binding the contract method 0x886f1195. +// +// Solidity: function pauserRegistry() view returns(address) +func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterCaller) PauserRegistry(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _DelayedWithdrawalRouter.contract.Call(opts, &out, "pauserRegistry") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// PauserRegistry is a free data retrieval call binding the contract method 0x886f1195. +// +// Solidity: function pauserRegistry() view returns(address) +func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterSession) PauserRegistry() (common.Address, error) { + return _DelayedWithdrawalRouter.Contract.PauserRegistry(&_DelayedWithdrawalRouter.CallOpts) +} + +// PauserRegistry is a free data retrieval call binding the contract method 0x886f1195. +// +// Solidity: function pauserRegistry() view returns(address) +func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterCallerSession) PauserRegistry() (common.Address, error) { + return _DelayedWithdrawalRouter.Contract.PauserRegistry(&_DelayedWithdrawalRouter.CallOpts) +} + +// UserDelayedWithdrawalByIndex is a free data retrieval call binding the contract method 0x85594e58. +// +// Solidity: function userDelayedWithdrawalByIndex(address user, uint256 index) view returns((uint224,uint32)) +func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterCaller) UserDelayedWithdrawalByIndex(opts *bind.CallOpts, user common.Address, index *big.Int) (IDelayedWithdrawalRouterDelayedWithdrawal, error) { + var out []interface{} + err := _DelayedWithdrawalRouter.contract.Call(opts, &out, "userDelayedWithdrawalByIndex", user, index) + + if err != nil { + return *new(IDelayedWithdrawalRouterDelayedWithdrawal), err + } + + out0 := *abi.ConvertType(out[0], new(IDelayedWithdrawalRouterDelayedWithdrawal)).(*IDelayedWithdrawalRouterDelayedWithdrawal) + + return out0, err + +} + +// UserDelayedWithdrawalByIndex is a free data retrieval call binding the contract method 0x85594e58. +// +// Solidity: function userDelayedWithdrawalByIndex(address user, uint256 index) view returns((uint224,uint32)) +func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterSession) UserDelayedWithdrawalByIndex(user common.Address, index *big.Int) (IDelayedWithdrawalRouterDelayedWithdrawal, error) { + return _DelayedWithdrawalRouter.Contract.UserDelayedWithdrawalByIndex(&_DelayedWithdrawalRouter.CallOpts, user, index) +} + +// UserDelayedWithdrawalByIndex is a free data retrieval call binding the contract method 0x85594e58. +// +// Solidity: function userDelayedWithdrawalByIndex(address user, uint256 index) view returns((uint224,uint32)) +func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterCallerSession) UserDelayedWithdrawalByIndex(user common.Address, index *big.Int) (IDelayedWithdrawalRouterDelayedWithdrawal, error) { + return _DelayedWithdrawalRouter.Contract.UserDelayedWithdrawalByIndex(&_DelayedWithdrawalRouter.CallOpts, user, index) +} + +// UserWithdrawals is a free data retrieval call binding the contract method 0xecb7cb1b. +// +// Solidity: function userWithdrawals(address user) view returns((uint256,(uint224,uint32)[])) +func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterCaller) UserWithdrawals(opts *bind.CallOpts, user common.Address) (IDelayedWithdrawalRouterUserDelayedWithdrawals, error) { + var out []interface{} + err := _DelayedWithdrawalRouter.contract.Call(opts, &out, "userWithdrawals", user) + + if err != nil { + return *new(IDelayedWithdrawalRouterUserDelayedWithdrawals), err + } + + out0 := *abi.ConvertType(out[0], new(IDelayedWithdrawalRouterUserDelayedWithdrawals)).(*IDelayedWithdrawalRouterUserDelayedWithdrawals) + + return out0, err + +} + +// UserWithdrawals is a free data retrieval call binding the contract method 0xecb7cb1b. +// +// Solidity: function userWithdrawals(address user) view returns((uint256,(uint224,uint32)[])) +func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterSession) UserWithdrawals(user common.Address) (IDelayedWithdrawalRouterUserDelayedWithdrawals, error) { + return _DelayedWithdrawalRouter.Contract.UserWithdrawals(&_DelayedWithdrawalRouter.CallOpts, user) +} + +// UserWithdrawals is a free data retrieval call binding the contract method 0xecb7cb1b. +// +// Solidity: function userWithdrawals(address user) view returns((uint256,(uint224,uint32)[])) +func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterCallerSession) UserWithdrawals(user common.Address) (IDelayedWithdrawalRouterUserDelayedWithdrawals, error) { + return _DelayedWithdrawalRouter.Contract.UserWithdrawals(&_DelayedWithdrawalRouter.CallOpts, user) +} + +// UserWithdrawalsLength is a free data retrieval call binding the contract method 0xe4f4f887. +// +// Solidity: function userWithdrawalsLength(address user) view returns(uint256) +func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterCaller) UserWithdrawalsLength(opts *bind.CallOpts, user common.Address) (*big.Int, error) { + var out []interface{} + err := _DelayedWithdrawalRouter.contract.Call(opts, &out, "userWithdrawalsLength", user) + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// UserWithdrawalsLength is a free data retrieval call binding the contract method 0xe4f4f887. +// +// Solidity: function userWithdrawalsLength(address user) view returns(uint256) +func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterSession) UserWithdrawalsLength(user common.Address) (*big.Int, error) { + return _DelayedWithdrawalRouter.Contract.UserWithdrawalsLength(&_DelayedWithdrawalRouter.CallOpts, user) +} + +// UserWithdrawalsLength is a free data retrieval call binding the contract method 0xe4f4f887. +// +// Solidity: function userWithdrawalsLength(address user) view returns(uint256) +func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterCallerSession) UserWithdrawalsLength(user common.Address) (*big.Int, error) { + return _DelayedWithdrawalRouter.Contract.UserWithdrawalsLength(&_DelayedWithdrawalRouter.CallOpts, user) +} + +// WithdrawalDelayBlocks is a free data retrieval call binding the contract method 0x50f73e7c. +// +// Solidity: function withdrawalDelayBlocks() view returns(uint256) +func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterCaller) WithdrawalDelayBlocks(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _DelayedWithdrawalRouter.contract.Call(opts, &out, "withdrawalDelayBlocks") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// WithdrawalDelayBlocks is a free data retrieval call binding the contract method 0x50f73e7c. +// +// Solidity: function withdrawalDelayBlocks() view returns(uint256) +func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterSession) WithdrawalDelayBlocks() (*big.Int, error) { + return _DelayedWithdrawalRouter.Contract.WithdrawalDelayBlocks(&_DelayedWithdrawalRouter.CallOpts) +} + +// WithdrawalDelayBlocks is a free data retrieval call binding the contract method 0x50f73e7c. +// +// Solidity: function withdrawalDelayBlocks() view returns(uint256) +func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterCallerSession) WithdrawalDelayBlocks() (*big.Int, error) { + return _DelayedWithdrawalRouter.Contract.WithdrawalDelayBlocks(&_DelayedWithdrawalRouter.CallOpts) +} + +// ClaimDelayedWithdrawals is a paid mutator transaction binding the contract method 0xd44e1b76. +// +// Solidity: function claimDelayedWithdrawals(uint256 maxNumberOfDelayedWithdrawalsToClaim) returns() +func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterTransactor) ClaimDelayedWithdrawals(opts *bind.TransactOpts, maxNumberOfDelayedWithdrawalsToClaim *big.Int) (*types.Transaction, error) { + return _DelayedWithdrawalRouter.contract.Transact(opts, "claimDelayedWithdrawals", maxNumberOfDelayedWithdrawalsToClaim) +} + +// ClaimDelayedWithdrawals is a paid mutator transaction binding the contract method 0xd44e1b76. +// +// Solidity: function claimDelayedWithdrawals(uint256 maxNumberOfDelayedWithdrawalsToClaim) returns() +func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterSession) ClaimDelayedWithdrawals(maxNumberOfDelayedWithdrawalsToClaim *big.Int) (*types.Transaction, error) { + return _DelayedWithdrawalRouter.Contract.ClaimDelayedWithdrawals(&_DelayedWithdrawalRouter.TransactOpts, maxNumberOfDelayedWithdrawalsToClaim) +} + +// ClaimDelayedWithdrawals is a paid mutator transaction binding the contract method 0xd44e1b76. +// +// Solidity: function claimDelayedWithdrawals(uint256 maxNumberOfDelayedWithdrawalsToClaim) returns() +func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterTransactorSession) ClaimDelayedWithdrawals(maxNumberOfDelayedWithdrawalsToClaim *big.Int) (*types.Transaction, error) { + return _DelayedWithdrawalRouter.Contract.ClaimDelayedWithdrawals(&_DelayedWithdrawalRouter.TransactOpts, maxNumberOfDelayedWithdrawalsToClaim) +} + +// ClaimDelayedWithdrawals0 is a paid mutator transaction binding the contract method 0xe5db06c0. +// +// Solidity: function claimDelayedWithdrawals(address recipient, uint256 maxNumberOfDelayedWithdrawalsToClaim) returns() +func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterTransactor) ClaimDelayedWithdrawals0(opts *bind.TransactOpts, recipient common.Address, maxNumberOfDelayedWithdrawalsToClaim *big.Int) (*types.Transaction, error) { + return _DelayedWithdrawalRouter.contract.Transact(opts, "claimDelayedWithdrawals0", recipient, maxNumberOfDelayedWithdrawalsToClaim) +} + +// ClaimDelayedWithdrawals0 is a paid mutator transaction binding the contract method 0xe5db06c0. +// +// Solidity: function claimDelayedWithdrawals(address recipient, uint256 maxNumberOfDelayedWithdrawalsToClaim) returns() +func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterSession) ClaimDelayedWithdrawals0(recipient common.Address, maxNumberOfDelayedWithdrawalsToClaim *big.Int) (*types.Transaction, error) { + return _DelayedWithdrawalRouter.Contract.ClaimDelayedWithdrawals0(&_DelayedWithdrawalRouter.TransactOpts, recipient, maxNumberOfDelayedWithdrawalsToClaim) +} + +// ClaimDelayedWithdrawals0 is a paid mutator transaction binding the contract method 0xe5db06c0. +// +// Solidity: function claimDelayedWithdrawals(address recipient, uint256 maxNumberOfDelayedWithdrawalsToClaim) returns() +func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterTransactorSession) ClaimDelayedWithdrawals0(recipient common.Address, maxNumberOfDelayedWithdrawalsToClaim *big.Int) (*types.Transaction, error) { + return _DelayedWithdrawalRouter.Contract.ClaimDelayedWithdrawals0(&_DelayedWithdrawalRouter.TransactOpts, recipient, maxNumberOfDelayedWithdrawalsToClaim) +} + +// CreateDelayedWithdrawal is a paid mutator transaction binding the contract method 0xc0db354c. +// +// Solidity: function createDelayedWithdrawal(address podOwner, address recipient) payable returns() +func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterTransactor) CreateDelayedWithdrawal(opts *bind.TransactOpts, podOwner common.Address, recipient common.Address) (*types.Transaction, error) { + return _DelayedWithdrawalRouter.contract.Transact(opts, "createDelayedWithdrawal", podOwner, recipient) +} + +// CreateDelayedWithdrawal is a paid mutator transaction binding the contract method 0xc0db354c. +// +// Solidity: function createDelayedWithdrawal(address podOwner, address recipient) payable returns() +func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterSession) CreateDelayedWithdrawal(podOwner common.Address, recipient common.Address) (*types.Transaction, error) { + return _DelayedWithdrawalRouter.Contract.CreateDelayedWithdrawal(&_DelayedWithdrawalRouter.TransactOpts, podOwner, recipient) +} + +// CreateDelayedWithdrawal is a paid mutator transaction binding the contract method 0xc0db354c. +// +// Solidity: function createDelayedWithdrawal(address podOwner, address recipient) payable returns() +func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterTransactorSession) CreateDelayedWithdrawal(podOwner common.Address, recipient common.Address) (*types.Transaction, error) { + return _DelayedWithdrawalRouter.Contract.CreateDelayedWithdrawal(&_DelayedWithdrawalRouter.TransactOpts, podOwner, recipient) +} + +// Initialize is a paid mutator transaction binding the contract method 0xeb990c59. +// +// Solidity: function initialize(address initOwner, address _pauserRegistry, uint256 initPausedStatus, uint256 _withdrawalDelayBlocks) returns() +func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterTransactor) Initialize(opts *bind.TransactOpts, initOwner common.Address, _pauserRegistry common.Address, initPausedStatus *big.Int, _withdrawalDelayBlocks *big.Int) (*types.Transaction, error) { + return _DelayedWithdrawalRouter.contract.Transact(opts, "initialize", initOwner, _pauserRegistry, initPausedStatus, _withdrawalDelayBlocks) +} + +// Initialize is a paid mutator transaction binding the contract method 0xeb990c59. +// +// Solidity: function initialize(address initOwner, address _pauserRegistry, uint256 initPausedStatus, uint256 _withdrawalDelayBlocks) returns() +func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterSession) Initialize(initOwner common.Address, _pauserRegistry common.Address, initPausedStatus *big.Int, _withdrawalDelayBlocks *big.Int) (*types.Transaction, error) { + return _DelayedWithdrawalRouter.Contract.Initialize(&_DelayedWithdrawalRouter.TransactOpts, initOwner, _pauserRegistry, initPausedStatus, _withdrawalDelayBlocks) +} + +// Initialize is a paid mutator transaction binding the contract method 0xeb990c59. +// +// Solidity: function initialize(address initOwner, address _pauserRegistry, uint256 initPausedStatus, uint256 _withdrawalDelayBlocks) returns() +func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterTransactorSession) Initialize(initOwner common.Address, _pauserRegistry common.Address, initPausedStatus *big.Int, _withdrawalDelayBlocks *big.Int) (*types.Transaction, error) { + return _DelayedWithdrawalRouter.Contract.Initialize(&_DelayedWithdrawalRouter.TransactOpts, initOwner, _pauserRegistry, initPausedStatus, _withdrawalDelayBlocks) +} + +// Pause is a paid mutator transaction binding the contract method 0x136439dd. +// +// Solidity: function pause(uint256 newPausedStatus) returns() +func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterTransactor) Pause(opts *bind.TransactOpts, newPausedStatus *big.Int) (*types.Transaction, error) { + return _DelayedWithdrawalRouter.contract.Transact(opts, "pause", newPausedStatus) +} + +// Pause is a paid mutator transaction binding the contract method 0x136439dd. +// +// Solidity: function pause(uint256 newPausedStatus) returns() +func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterSession) Pause(newPausedStatus *big.Int) (*types.Transaction, error) { + return _DelayedWithdrawalRouter.Contract.Pause(&_DelayedWithdrawalRouter.TransactOpts, newPausedStatus) +} + +// Pause is a paid mutator transaction binding the contract method 0x136439dd. +// +// Solidity: function pause(uint256 newPausedStatus) returns() +func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterTransactorSession) Pause(newPausedStatus *big.Int) (*types.Transaction, error) { + return _DelayedWithdrawalRouter.Contract.Pause(&_DelayedWithdrawalRouter.TransactOpts, newPausedStatus) +} + +// PauseAll is a paid mutator transaction binding the contract method 0x595c6a67. +// +// Solidity: function pauseAll() returns() +func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterTransactor) PauseAll(opts *bind.TransactOpts) (*types.Transaction, error) { + return _DelayedWithdrawalRouter.contract.Transact(opts, "pauseAll") +} + +// PauseAll is a paid mutator transaction binding the contract method 0x595c6a67. +// +// Solidity: function pauseAll() returns() +func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterSession) PauseAll() (*types.Transaction, error) { + return _DelayedWithdrawalRouter.Contract.PauseAll(&_DelayedWithdrawalRouter.TransactOpts) +} + +// PauseAll is a paid mutator transaction binding the contract method 0x595c6a67. +// +// Solidity: function pauseAll() returns() +func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterTransactorSession) PauseAll() (*types.Transaction, error) { + return _DelayedWithdrawalRouter.Contract.PauseAll(&_DelayedWithdrawalRouter.TransactOpts) +} + +// RenounceOwnership is a paid mutator transaction binding the contract method 0x715018a6. +// +// Solidity: function renounceOwnership() returns() +func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterTransactor) RenounceOwnership(opts *bind.TransactOpts) (*types.Transaction, error) { + return _DelayedWithdrawalRouter.contract.Transact(opts, "renounceOwnership") +} + +// RenounceOwnership is a paid mutator transaction binding the contract method 0x715018a6. +// +// Solidity: function renounceOwnership() returns() +func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterSession) RenounceOwnership() (*types.Transaction, error) { + return _DelayedWithdrawalRouter.Contract.RenounceOwnership(&_DelayedWithdrawalRouter.TransactOpts) +} + +// RenounceOwnership is a paid mutator transaction binding the contract method 0x715018a6. +// +// Solidity: function renounceOwnership() returns() +func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterTransactorSession) RenounceOwnership() (*types.Transaction, error) { + return _DelayedWithdrawalRouter.Contract.RenounceOwnership(&_DelayedWithdrawalRouter.TransactOpts) +} + +// SetPauserRegistry is a paid mutator transaction binding the contract method 0x10d67a2f. +// +// Solidity: function setPauserRegistry(address newPauserRegistry) returns() +func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterTransactor) SetPauserRegistry(opts *bind.TransactOpts, newPauserRegistry common.Address) (*types.Transaction, error) { + return _DelayedWithdrawalRouter.contract.Transact(opts, "setPauserRegistry", newPauserRegistry) +} + +// SetPauserRegistry is a paid mutator transaction binding the contract method 0x10d67a2f. +// +// Solidity: function setPauserRegistry(address newPauserRegistry) returns() +func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterSession) SetPauserRegistry(newPauserRegistry common.Address) (*types.Transaction, error) { + return _DelayedWithdrawalRouter.Contract.SetPauserRegistry(&_DelayedWithdrawalRouter.TransactOpts, newPauserRegistry) +} + +// SetPauserRegistry is a paid mutator transaction binding the contract method 0x10d67a2f. +// +// Solidity: function setPauserRegistry(address newPauserRegistry) returns() +func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterTransactorSession) SetPauserRegistry(newPauserRegistry common.Address) (*types.Transaction, error) { + return _DelayedWithdrawalRouter.Contract.SetPauserRegistry(&_DelayedWithdrawalRouter.TransactOpts, newPauserRegistry) +} + +// SetWithdrawalDelayBlocks is a paid mutator transaction binding the contract method 0x4d50f9a4. +// +// Solidity: function setWithdrawalDelayBlocks(uint256 newValue) returns() +func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterTransactor) SetWithdrawalDelayBlocks(opts *bind.TransactOpts, newValue *big.Int) (*types.Transaction, error) { + return _DelayedWithdrawalRouter.contract.Transact(opts, "setWithdrawalDelayBlocks", newValue) +} + +// SetWithdrawalDelayBlocks is a paid mutator transaction binding the contract method 0x4d50f9a4. +// +// Solidity: function setWithdrawalDelayBlocks(uint256 newValue) returns() +func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterSession) SetWithdrawalDelayBlocks(newValue *big.Int) (*types.Transaction, error) { + return _DelayedWithdrawalRouter.Contract.SetWithdrawalDelayBlocks(&_DelayedWithdrawalRouter.TransactOpts, newValue) +} + +// SetWithdrawalDelayBlocks is a paid mutator transaction binding the contract method 0x4d50f9a4. +// +// Solidity: function setWithdrawalDelayBlocks(uint256 newValue) returns() +func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterTransactorSession) SetWithdrawalDelayBlocks(newValue *big.Int) (*types.Transaction, error) { + return _DelayedWithdrawalRouter.Contract.SetWithdrawalDelayBlocks(&_DelayedWithdrawalRouter.TransactOpts, newValue) +} + +// TransferOwnership is a paid mutator transaction binding the contract method 0xf2fde38b. +// +// Solidity: function transferOwnership(address newOwner) returns() +func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterTransactor) TransferOwnership(opts *bind.TransactOpts, newOwner common.Address) (*types.Transaction, error) { + return _DelayedWithdrawalRouter.contract.Transact(opts, "transferOwnership", newOwner) +} + +// TransferOwnership is a paid mutator transaction binding the contract method 0xf2fde38b. +// +// Solidity: function transferOwnership(address newOwner) returns() +func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterSession) TransferOwnership(newOwner common.Address) (*types.Transaction, error) { + return _DelayedWithdrawalRouter.Contract.TransferOwnership(&_DelayedWithdrawalRouter.TransactOpts, newOwner) +} + +// TransferOwnership is a paid mutator transaction binding the contract method 0xf2fde38b. +// +// Solidity: function transferOwnership(address newOwner) returns() +func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterTransactorSession) TransferOwnership(newOwner common.Address) (*types.Transaction, error) { + return _DelayedWithdrawalRouter.Contract.TransferOwnership(&_DelayedWithdrawalRouter.TransactOpts, newOwner) +} + +// Unpause is a paid mutator transaction binding the contract method 0xfabc1cbc. +// +// Solidity: function unpause(uint256 newPausedStatus) returns() +func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterTransactor) Unpause(opts *bind.TransactOpts, newPausedStatus *big.Int) (*types.Transaction, error) { + return _DelayedWithdrawalRouter.contract.Transact(opts, "unpause", newPausedStatus) +} + +// Unpause is a paid mutator transaction binding the contract method 0xfabc1cbc. +// +// Solidity: function unpause(uint256 newPausedStatus) returns() +func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterSession) Unpause(newPausedStatus *big.Int) (*types.Transaction, error) { + return _DelayedWithdrawalRouter.Contract.Unpause(&_DelayedWithdrawalRouter.TransactOpts, newPausedStatus) +} + +// Unpause is a paid mutator transaction binding the contract method 0xfabc1cbc. +// +// Solidity: function unpause(uint256 newPausedStatus) returns() +func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterTransactorSession) Unpause(newPausedStatus *big.Int) (*types.Transaction, error) { + return _DelayedWithdrawalRouter.Contract.Unpause(&_DelayedWithdrawalRouter.TransactOpts, newPausedStatus) +} + +// DelayedWithdrawalRouterDelayedWithdrawalCreatedIterator is returned from FilterDelayedWithdrawalCreated and is used to iterate over the raw logs and unpacked data for DelayedWithdrawalCreated events raised by the DelayedWithdrawalRouter contract. +type DelayedWithdrawalRouterDelayedWithdrawalCreatedIterator struct { + Event *DelayedWithdrawalRouterDelayedWithdrawalCreated // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + 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 *DelayedWithdrawalRouterDelayedWithdrawalCreatedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(DelayedWithdrawalRouterDelayedWithdrawalCreated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(DelayedWithdrawalRouterDelayedWithdrawalCreated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *DelayedWithdrawalRouterDelayedWithdrawalCreatedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *DelayedWithdrawalRouterDelayedWithdrawalCreatedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// DelayedWithdrawalRouterDelayedWithdrawalCreated represents a DelayedWithdrawalCreated event raised by the DelayedWithdrawalRouter contract. +type DelayedWithdrawalRouterDelayedWithdrawalCreated struct { + PodOwner common.Address + Recipient common.Address + Amount *big.Int + Index *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterDelayedWithdrawalCreated is a free log retrieval operation binding the contract event 0xb8f1b14c7caf74150801dcc9bc18d575cbeaf5b421943497e409df92c92e0f59. +// +// Solidity: event DelayedWithdrawalCreated(address podOwner, address recipient, uint256 amount, uint256 index) +func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterFilterer) FilterDelayedWithdrawalCreated(opts *bind.FilterOpts) (*DelayedWithdrawalRouterDelayedWithdrawalCreatedIterator, error) { + + logs, sub, err := _DelayedWithdrawalRouter.contract.FilterLogs(opts, "DelayedWithdrawalCreated") + if err != nil { + return nil, err + } + return &DelayedWithdrawalRouterDelayedWithdrawalCreatedIterator{contract: _DelayedWithdrawalRouter.contract, event: "DelayedWithdrawalCreated", logs: logs, sub: sub}, nil +} + +// WatchDelayedWithdrawalCreated is a free log subscription operation binding the contract event 0xb8f1b14c7caf74150801dcc9bc18d575cbeaf5b421943497e409df92c92e0f59. +// +// Solidity: event DelayedWithdrawalCreated(address podOwner, address recipient, uint256 amount, uint256 index) +func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterFilterer) WatchDelayedWithdrawalCreated(opts *bind.WatchOpts, sink chan<- *DelayedWithdrawalRouterDelayedWithdrawalCreated) (event.Subscription, error) { + + logs, sub, err := _DelayedWithdrawalRouter.contract.WatchLogs(opts, "DelayedWithdrawalCreated") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(DelayedWithdrawalRouterDelayedWithdrawalCreated) + if err := _DelayedWithdrawalRouter.contract.UnpackLog(event, "DelayedWithdrawalCreated", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseDelayedWithdrawalCreated is a log parse operation binding the contract event 0xb8f1b14c7caf74150801dcc9bc18d575cbeaf5b421943497e409df92c92e0f59. +// +// Solidity: event DelayedWithdrawalCreated(address podOwner, address recipient, uint256 amount, uint256 index) +func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterFilterer) ParseDelayedWithdrawalCreated(log types.Log) (*DelayedWithdrawalRouterDelayedWithdrawalCreated, error) { + event := new(DelayedWithdrawalRouterDelayedWithdrawalCreated) + if err := _DelayedWithdrawalRouter.contract.UnpackLog(event, "DelayedWithdrawalCreated", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// DelayedWithdrawalRouterDelayedWithdrawalsClaimedIterator is returned from FilterDelayedWithdrawalsClaimed and is used to iterate over the raw logs and unpacked data for DelayedWithdrawalsClaimed events raised by the DelayedWithdrawalRouter contract. +type DelayedWithdrawalRouterDelayedWithdrawalsClaimedIterator struct { + Event *DelayedWithdrawalRouterDelayedWithdrawalsClaimed // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + 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 *DelayedWithdrawalRouterDelayedWithdrawalsClaimedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(DelayedWithdrawalRouterDelayedWithdrawalsClaimed) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(DelayedWithdrawalRouterDelayedWithdrawalsClaimed) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *DelayedWithdrawalRouterDelayedWithdrawalsClaimedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *DelayedWithdrawalRouterDelayedWithdrawalsClaimedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// DelayedWithdrawalRouterDelayedWithdrawalsClaimed represents a DelayedWithdrawalsClaimed event raised by the DelayedWithdrawalRouter contract. +type DelayedWithdrawalRouterDelayedWithdrawalsClaimed struct { + Recipient common.Address + AmountClaimed *big.Int + DelayedWithdrawalsCompleted *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterDelayedWithdrawalsClaimed is a free log retrieval operation binding the contract event 0x6b7151500bd0b5cc211bcc47b3029831b769004df4549e8e1c9a69da05bb0943. +// +// Solidity: event DelayedWithdrawalsClaimed(address recipient, uint256 amountClaimed, uint256 delayedWithdrawalsCompleted) +func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterFilterer) FilterDelayedWithdrawalsClaimed(opts *bind.FilterOpts) (*DelayedWithdrawalRouterDelayedWithdrawalsClaimedIterator, error) { + + logs, sub, err := _DelayedWithdrawalRouter.contract.FilterLogs(opts, "DelayedWithdrawalsClaimed") + if err != nil { + return nil, err + } + return &DelayedWithdrawalRouterDelayedWithdrawalsClaimedIterator{contract: _DelayedWithdrawalRouter.contract, event: "DelayedWithdrawalsClaimed", logs: logs, sub: sub}, nil +} + +// WatchDelayedWithdrawalsClaimed is a free log subscription operation binding the contract event 0x6b7151500bd0b5cc211bcc47b3029831b769004df4549e8e1c9a69da05bb0943. +// +// Solidity: event DelayedWithdrawalsClaimed(address recipient, uint256 amountClaimed, uint256 delayedWithdrawalsCompleted) +func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterFilterer) WatchDelayedWithdrawalsClaimed(opts *bind.WatchOpts, sink chan<- *DelayedWithdrawalRouterDelayedWithdrawalsClaimed) (event.Subscription, error) { + + logs, sub, err := _DelayedWithdrawalRouter.contract.WatchLogs(opts, "DelayedWithdrawalsClaimed") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(DelayedWithdrawalRouterDelayedWithdrawalsClaimed) + if err := _DelayedWithdrawalRouter.contract.UnpackLog(event, "DelayedWithdrawalsClaimed", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseDelayedWithdrawalsClaimed is a log parse operation binding the contract event 0x6b7151500bd0b5cc211bcc47b3029831b769004df4549e8e1c9a69da05bb0943. +// +// Solidity: event DelayedWithdrawalsClaimed(address recipient, uint256 amountClaimed, uint256 delayedWithdrawalsCompleted) +func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterFilterer) ParseDelayedWithdrawalsClaimed(log types.Log) (*DelayedWithdrawalRouterDelayedWithdrawalsClaimed, error) { + event := new(DelayedWithdrawalRouterDelayedWithdrawalsClaimed) + if err := _DelayedWithdrawalRouter.contract.UnpackLog(event, "DelayedWithdrawalsClaimed", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// DelayedWithdrawalRouterInitializedIterator is returned from FilterInitialized and is used to iterate over the raw logs and unpacked data for Initialized events raised by the DelayedWithdrawalRouter contract. +type DelayedWithdrawalRouterInitializedIterator struct { + Event *DelayedWithdrawalRouterInitialized // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + 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 *DelayedWithdrawalRouterInitializedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(DelayedWithdrawalRouterInitialized) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(DelayedWithdrawalRouterInitialized) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *DelayedWithdrawalRouterInitializedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *DelayedWithdrawalRouterInitializedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// DelayedWithdrawalRouterInitialized represents a Initialized event raised by the DelayedWithdrawalRouter contract. +type DelayedWithdrawalRouterInitialized 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 (_DelayedWithdrawalRouter *DelayedWithdrawalRouterFilterer) FilterInitialized(opts *bind.FilterOpts) (*DelayedWithdrawalRouterInitializedIterator, error) { + + logs, sub, err := _DelayedWithdrawalRouter.contract.FilterLogs(opts, "Initialized") + if err != nil { + return nil, err + } + return &DelayedWithdrawalRouterInitializedIterator{contract: _DelayedWithdrawalRouter.contract, event: "Initialized", logs: logs, sub: sub}, nil +} + +// WatchInitialized is a free log subscription operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498. +// +// Solidity: event Initialized(uint8 version) +func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterFilterer) WatchInitialized(opts *bind.WatchOpts, sink chan<- *DelayedWithdrawalRouterInitialized) (event.Subscription, error) { + + logs, sub, err := _DelayedWithdrawalRouter.contract.WatchLogs(opts, "Initialized") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(DelayedWithdrawalRouterInitialized) + if err := _DelayedWithdrawalRouter.contract.UnpackLog(event, "Initialized", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseInitialized is a log parse operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498. +// +// Solidity: event Initialized(uint8 version) +func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterFilterer) ParseInitialized(log types.Log) (*DelayedWithdrawalRouterInitialized, error) { + event := new(DelayedWithdrawalRouterInitialized) + if err := _DelayedWithdrawalRouter.contract.UnpackLog(event, "Initialized", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// DelayedWithdrawalRouterOwnershipTransferredIterator is returned from FilterOwnershipTransferred and is used to iterate over the raw logs and unpacked data for OwnershipTransferred events raised by the DelayedWithdrawalRouter contract. +type DelayedWithdrawalRouterOwnershipTransferredIterator struct { + Event *DelayedWithdrawalRouterOwnershipTransferred // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + 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 *DelayedWithdrawalRouterOwnershipTransferredIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(DelayedWithdrawalRouterOwnershipTransferred) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(DelayedWithdrawalRouterOwnershipTransferred) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *DelayedWithdrawalRouterOwnershipTransferredIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *DelayedWithdrawalRouterOwnershipTransferredIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// DelayedWithdrawalRouterOwnershipTransferred represents a OwnershipTransferred event raised by the DelayedWithdrawalRouter contract. +type DelayedWithdrawalRouterOwnershipTransferred 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 (_DelayedWithdrawalRouter *DelayedWithdrawalRouterFilterer) FilterOwnershipTransferred(opts *bind.FilterOpts, previousOwner []common.Address, newOwner []common.Address) (*DelayedWithdrawalRouterOwnershipTransferredIterator, error) { + + var previousOwnerRule []interface{} + for _, previousOwnerItem := range previousOwner { + previousOwnerRule = append(previousOwnerRule, previousOwnerItem) + } + var newOwnerRule []interface{} + for _, newOwnerItem := range newOwner { + newOwnerRule = append(newOwnerRule, newOwnerItem) + } + + logs, sub, err := _DelayedWithdrawalRouter.contract.FilterLogs(opts, "OwnershipTransferred", previousOwnerRule, newOwnerRule) + if err != nil { + return nil, err + } + return &DelayedWithdrawalRouterOwnershipTransferredIterator{contract: _DelayedWithdrawalRouter.contract, event: "OwnershipTransferred", logs: logs, sub: sub}, nil +} + +// WatchOwnershipTransferred is a free log subscription operation binding the contract event 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0. +// +// Solidity: event OwnershipTransferred(address indexed previousOwner, address indexed newOwner) +func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterFilterer) WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *DelayedWithdrawalRouterOwnershipTransferred, previousOwner []common.Address, newOwner []common.Address) (event.Subscription, error) { + + var previousOwnerRule []interface{} + for _, previousOwnerItem := range previousOwner { + previousOwnerRule = append(previousOwnerRule, previousOwnerItem) + } + var newOwnerRule []interface{} + for _, newOwnerItem := range newOwner { + newOwnerRule = append(newOwnerRule, newOwnerItem) + } + + logs, sub, err := _DelayedWithdrawalRouter.contract.WatchLogs(opts, "OwnershipTransferred", previousOwnerRule, newOwnerRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(DelayedWithdrawalRouterOwnershipTransferred) + if err := _DelayedWithdrawalRouter.contract.UnpackLog(event, "OwnershipTransferred", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseOwnershipTransferred is a log parse operation binding the contract event 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0. +// +// Solidity: event OwnershipTransferred(address indexed previousOwner, address indexed newOwner) +func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterFilterer) ParseOwnershipTransferred(log types.Log) (*DelayedWithdrawalRouterOwnershipTransferred, error) { + event := new(DelayedWithdrawalRouterOwnershipTransferred) + if err := _DelayedWithdrawalRouter.contract.UnpackLog(event, "OwnershipTransferred", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// DelayedWithdrawalRouterPausedIterator is returned from FilterPaused and is used to iterate over the raw logs and unpacked data for Paused events raised by the DelayedWithdrawalRouter contract. +type DelayedWithdrawalRouterPausedIterator struct { + Event *DelayedWithdrawalRouterPaused // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + 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 *DelayedWithdrawalRouterPausedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(DelayedWithdrawalRouterPaused) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(DelayedWithdrawalRouterPaused) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *DelayedWithdrawalRouterPausedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *DelayedWithdrawalRouterPausedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// DelayedWithdrawalRouterPaused represents a Paused event raised by the DelayedWithdrawalRouter contract. +type DelayedWithdrawalRouterPaused 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 (_DelayedWithdrawalRouter *DelayedWithdrawalRouterFilterer) FilterPaused(opts *bind.FilterOpts, account []common.Address) (*DelayedWithdrawalRouterPausedIterator, error) { + + var accountRule []interface{} + for _, accountItem := range account { + accountRule = append(accountRule, accountItem) + } + + logs, sub, err := _DelayedWithdrawalRouter.contract.FilterLogs(opts, "Paused", accountRule) + if err != nil { + return nil, err + } + return &DelayedWithdrawalRouterPausedIterator{contract: _DelayedWithdrawalRouter.contract, event: "Paused", logs: logs, sub: sub}, nil +} + +// WatchPaused is a free log subscription operation binding the contract event 0xab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d. +// +// Solidity: event Paused(address indexed account, uint256 newPausedStatus) +func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterFilterer) WatchPaused(opts *bind.WatchOpts, sink chan<- *DelayedWithdrawalRouterPaused, account []common.Address) (event.Subscription, error) { + + var accountRule []interface{} + for _, accountItem := range account { + accountRule = append(accountRule, accountItem) + } + + logs, sub, err := _DelayedWithdrawalRouter.contract.WatchLogs(opts, "Paused", accountRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(DelayedWithdrawalRouterPaused) + if err := _DelayedWithdrawalRouter.contract.UnpackLog(event, "Paused", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParsePaused is a log parse operation binding the contract event 0xab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d. +// +// Solidity: event Paused(address indexed account, uint256 newPausedStatus) +func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterFilterer) ParsePaused(log types.Log) (*DelayedWithdrawalRouterPaused, error) { + event := new(DelayedWithdrawalRouterPaused) + if err := _DelayedWithdrawalRouter.contract.UnpackLog(event, "Paused", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// DelayedWithdrawalRouterPauserRegistrySetIterator is returned from FilterPauserRegistrySet and is used to iterate over the raw logs and unpacked data for PauserRegistrySet events raised by the DelayedWithdrawalRouter contract. +type DelayedWithdrawalRouterPauserRegistrySetIterator struct { + Event *DelayedWithdrawalRouterPauserRegistrySet // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + 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 *DelayedWithdrawalRouterPauserRegistrySetIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(DelayedWithdrawalRouterPauserRegistrySet) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(DelayedWithdrawalRouterPauserRegistrySet) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *DelayedWithdrawalRouterPauserRegistrySetIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *DelayedWithdrawalRouterPauserRegistrySetIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// DelayedWithdrawalRouterPauserRegistrySet represents a PauserRegistrySet event raised by the DelayedWithdrawalRouter contract. +type DelayedWithdrawalRouterPauserRegistrySet struct { + PauserRegistry common.Address + NewPauserRegistry common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterPauserRegistrySet is a free log retrieval operation binding the contract event 0x6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6. +// +// Solidity: event PauserRegistrySet(address pauserRegistry, address newPauserRegistry) +func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterFilterer) FilterPauserRegistrySet(opts *bind.FilterOpts) (*DelayedWithdrawalRouterPauserRegistrySetIterator, error) { + + logs, sub, err := _DelayedWithdrawalRouter.contract.FilterLogs(opts, "PauserRegistrySet") + if err != nil { + return nil, err + } + return &DelayedWithdrawalRouterPauserRegistrySetIterator{contract: _DelayedWithdrawalRouter.contract, event: "PauserRegistrySet", logs: logs, sub: sub}, nil +} + +// WatchPauserRegistrySet is a free log subscription operation binding the contract event 0x6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6. +// +// Solidity: event PauserRegistrySet(address pauserRegistry, address newPauserRegistry) +func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterFilterer) WatchPauserRegistrySet(opts *bind.WatchOpts, sink chan<- *DelayedWithdrawalRouterPauserRegistrySet) (event.Subscription, error) { + + logs, sub, err := _DelayedWithdrawalRouter.contract.WatchLogs(opts, "PauserRegistrySet") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(DelayedWithdrawalRouterPauserRegistrySet) + if err := _DelayedWithdrawalRouter.contract.UnpackLog(event, "PauserRegistrySet", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParsePauserRegistrySet is a log parse operation binding the contract event 0x6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6. +// +// Solidity: event PauserRegistrySet(address pauserRegistry, address newPauserRegistry) +func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterFilterer) ParsePauserRegistrySet(log types.Log) (*DelayedWithdrawalRouterPauserRegistrySet, error) { + event := new(DelayedWithdrawalRouterPauserRegistrySet) + if err := _DelayedWithdrawalRouter.contract.UnpackLog(event, "PauserRegistrySet", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// DelayedWithdrawalRouterUnpausedIterator is returned from FilterUnpaused and is used to iterate over the raw logs and unpacked data for Unpaused events raised by the DelayedWithdrawalRouter contract. +type DelayedWithdrawalRouterUnpausedIterator struct { + Event *DelayedWithdrawalRouterUnpaused // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + 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 *DelayedWithdrawalRouterUnpausedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(DelayedWithdrawalRouterUnpaused) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(DelayedWithdrawalRouterUnpaused) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *DelayedWithdrawalRouterUnpausedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *DelayedWithdrawalRouterUnpausedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// DelayedWithdrawalRouterUnpaused represents a Unpaused event raised by the DelayedWithdrawalRouter contract. +type DelayedWithdrawalRouterUnpaused 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 (_DelayedWithdrawalRouter *DelayedWithdrawalRouterFilterer) FilterUnpaused(opts *bind.FilterOpts, account []common.Address) (*DelayedWithdrawalRouterUnpausedIterator, error) { + + var accountRule []interface{} + for _, accountItem := range account { + accountRule = append(accountRule, accountItem) + } + + logs, sub, err := _DelayedWithdrawalRouter.contract.FilterLogs(opts, "Unpaused", accountRule) + if err != nil { + return nil, err + } + return &DelayedWithdrawalRouterUnpausedIterator{contract: _DelayedWithdrawalRouter.contract, event: "Unpaused", logs: logs, sub: sub}, nil +} + +// WatchUnpaused is a free log subscription operation binding the contract event 0x3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c. +// +// Solidity: event Unpaused(address indexed account, uint256 newPausedStatus) +func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterFilterer) WatchUnpaused(opts *bind.WatchOpts, sink chan<- *DelayedWithdrawalRouterUnpaused, account []common.Address) (event.Subscription, error) { + + var accountRule []interface{} + for _, accountItem := range account { + accountRule = append(accountRule, accountItem) + } + + logs, sub, err := _DelayedWithdrawalRouter.contract.WatchLogs(opts, "Unpaused", accountRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(DelayedWithdrawalRouterUnpaused) + if err := _DelayedWithdrawalRouter.contract.UnpackLog(event, "Unpaused", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseUnpaused is a log parse operation binding the contract event 0x3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c. +// +// Solidity: event Unpaused(address indexed account, uint256 newPausedStatus) +func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterFilterer) ParseUnpaused(log types.Log) (*DelayedWithdrawalRouterUnpaused, error) { + event := new(DelayedWithdrawalRouterUnpaused) + if err := _DelayedWithdrawalRouter.contract.UnpackLog(event, "Unpaused", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// DelayedWithdrawalRouterWithdrawalDelayBlocksSetIterator is returned from FilterWithdrawalDelayBlocksSet and is used to iterate over the raw logs and unpacked data for WithdrawalDelayBlocksSet events raised by the DelayedWithdrawalRouter contract. +type DelayedWithdrawalRouterWithdrawalDelayBlocksSetIterator struct { + Event *DelayedWithdrawalRouterWithdrawalDelayBlocksSet // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + 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 *DelayedWithdrawalRouterWithdrawalDelayBlocksSetIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(DelayedWithdrawalRouterWithdrawalDelayBlocksSet) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(DelayedWithdrawalRouterWithdrawalDelayBlocksSet) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *DelayedWithdrawalRouterWithdrawalDelayBlocksSetIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *DelayedWithdrawalRouterWithdrawalDelayBlocksSetIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// DelayedWithdrawalRouterWithdrawalDelayBlocksSet represents a WithdrawalDelayBlocksSet event raised by the DelayedWithdrawalRouter contract. +type DelayedWithdrawalRouterWithdrawalDelayBlocksSet struct { + PreviousValue *big.Int + NewValue *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterWithdrawalDelayBlocksSet is a free log retrieval operation binding the contract event 0x4ffb00400574147429ee377a5633386321e66d45d8b14676014b5fa393e61e9e. +// +// Solidity: event WithdrawalDelayBlocksSet(uint256 previousValue, uint256 newValue) +func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterFilterer) FilterWithdrawalDelayBlocksSet(opts *bind.FilterOpts) (*DelayedWithdrawalRouterWithdrawalDelayBlocksSetIterator, error) { + + logs, sub, err := _DelayedWithdrawalRouter.contract.FilterLogs(opts, "WithdrawalDelayBlocksSet") + if err != nil { + return nil, err + } + return &DelayedWithdrawalRouterWithdrawalDelayBlocksSetIterator{contract: _DelayedWithdrawalRouter.contract, event: "WithdrawalDelayBlocksSet", logs: logs, sub: sub}, nil +} + +// WatchWithdrawalDelayBlocksSet is a free log subscription operation binding the contract event 0x4ffb00400574147429ee377a5633386321e66d45d8b14676014b5fa393e61e9e. +// +// Solidity: event WithdrawalDelayBlocksSet(uint256 previousValue, uint256 newValue) +func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterFilterer) WatchWithdrawalDelayBlocksSet(opts *bind.WatchOpts, sink chan<- *DelayedWithdrawalRouterWithdrawalDelayBlocksSet) (event.Subscription, error) { + + logs, sub, err := _DelayedWithdrawalRouter.contract.WatchLogs(opts, "WithdrawalDelayBlocksSet") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(DelayedWithdrawalRouterWithdrawalDelayBlocksSet) + if err := _DelayedWithdrawalRouter.contract.UnpackLog(event, "WithdrawalDelayBlocksSet", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseWithdrawalDelayBlocksSet is a log parse operation binding the contract event 0x4ffb00400574147429ee377a5633386321e66d45d8b14676014b5fa393e61e9e. +// +// Solidity: event WithdrawalDelayBlocksSet(uint256 previousValue, uint256 newValue) +func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterFilterer) ParseWithdrawalDelayBlocksSet(log types.Log) (*DelayedWithdrawalRouterWithdrawalDelayBlocksSet, error) { + event := new(DelayedWithdrawalRouterWithdrawalDelayBlocksSet) + if err := _DelayedWithdrawalRouter.contract.UnpackLog(event, "WithdrawalDelayBlocksSet", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} diff --git a/pkg/bindings/DelegationManager/binding.go b/pkg/bindings/DelegationManager/binding.go index cf241371c..106a65762 100644 --- a/pkg/bindings/DelegationManager/binding.go +++ b/pkg/bindings/DelegationManager/binding.go @@ -62,8 +62,8 @@ type ISignatureUtilsSignatureWithExpiry struct { // DelegationManagerMetaData contains all meta data concerning the DelegationManager contract. var DelegationManagerMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_strategyManager\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"},{\"name\":\"_slasher\",\"type\":\"address\",\"internalType\":\"contractISlasher\"},{\"name\":\"_eigenPodManager\",\"type\":\"address\",\"internalType\":\"contractIEigenPodManager\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"DELEGATION_APPROVAL_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"DOMAIN_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_STAKER_OPT_OUT_WINDOW_BLOCKS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_WITHDRAWAL_DELAY_BLOCKS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"STAKER_DELEGATION_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\":\"calculateCurrentStakerDelegationDigestHash\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"calculateStakerDelegationDigestHash\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_stakerNonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateWithdrawalRoot\",\"inputs\":[{\"name\":\"withdrawal\",\"type\":\"tuple\",\"internalType\":\"structIDelegationManager.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\":\"shares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"completeQueuedWithdrawal\",\"inputs\":[{\"name\":\"withdrawal\",\"type\":\"tuple\",\"internalType\":\"structIDelegationManager.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\":\"shares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]},{\"name\":\"tokens\",\"type\":\"address[]\",\"internalType\":\"contractIERC20[]\"},{\"name\":\"middlewareTimesIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"receiveAsTokens\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeQueuedWithdrawals\",\"inputs\":[{\"name\":\"withdrawals\",\"type\":\"tuple[]\",\"internalType\":\"structIDelegationManager.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\":\"shares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]},{\"name\":\"tokens\",\"type\":\"address[][]\",\"internalType\":\"contractIERC20[][]\"},{\"name\":\"middlewareTimesIndexes\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"receiveAsTokens\",\"type\":\"bool[]\",\"internalType\":\"bool[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"cumulativeWithdrawalsQueued\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"decreaseDelegatedShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegateTo\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"approverSignatureAndExpiry\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtils.SignatureWithExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"approverSalt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegateToBySignature\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"stakerSignatureAndExpiry\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtils.SignatureWithExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"approverSignatureAndExpiry\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtils.SignatureWithExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"approverSalt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegatedTo\",\"inputs\":[{\"name\":\"\",\"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\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"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\":\"getDelegatableShares\",\"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\":\"getWithdrawalDelay\",\"inputs\":[{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"increaseDelegatedShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"initialPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_minWithdrawalDelayBlocks\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"_withdrawalDelayBlocks\",\"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\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"modifyOperatorDetails\",\"inputs\":[{\"name\":\"newOperatorDetails\",\"type\":\"tuple\",\"internalType\":\"structIDelegationManager.OperatorDetails\",\"components\":[{\"name\":\"__deprecated_earningsReceiver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegationApprover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"stakerOptOutWindowBlocks\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"operatorDetails\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIDelegationManager.OperatorDetails\",\"components\":[{\"name\":\"__deprecated_earningsReceiver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegationApprover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"stakerOptOutWindowBlocks\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"operatorShares\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pendingWithdrawals\",\"inputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"queueWithdrawals\",\"inputs\":[{\"name\":\"queuedWithdrawalParams\",\"type\":\"tuple[]\",\"internalType\":\"structIDelegationManager.QueuedWithdrawalParams[]\",\"components\":[{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"shares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registerAsOperator\",\"inputs\":[{\"name\":\"registeringOperatorDetails\",\"type\":\"tuple\",\"internalType\":\"structIDelegationManager.OperatorDetails\",\"components\":[{\"name\":\"__deprecated_earningsReceiver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegationApprover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"stakerOptOutWindowBlocks\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"metadataURI\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setMinWithdrawalDelayBlocks\",\"inputs\":[{\"name\":\"newMinWithdrawalDelayBlocks\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setPauserRegistry\",\"inputs\":[{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setStrategyWithdrawalDelayBlocks\",\"inputs\":[{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"withdrawalDelayBlocks\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"slasher\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractISlasher\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"stakerNonce\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"stakerOptOutWindowBlocks\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"strategyManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"strategyWithdrawalDelayBlocks\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"undelegate\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"withdrawalRoots\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateOperatorMetadataURI\",\"inputs\":[{\"name\":\"metadataURI\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"MinWithdrawalDelayBlocksSet\",\"inputs\":[{\"name\":\"previousValue\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"newValue\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorDetailsModified\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOperatorDetails\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIDelegationManager.OperatorDetails\",\"components\":[{\"name\":\"__deprecated_earningsReceiver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegationApprover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"stakerOptOutWindowBlocks\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"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\":\"operatorDetails\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIDelegationManager.OperatorDetails\",\"components\":[{\"name\":\"__deprecated_earningsReceiver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegationApprover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"stakerOptOutWindowBlocks\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSharesDecreased\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"staker\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSharesIncreased\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"staker\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PauserRegistrySet\",\"inputs\":[{\"name\":\"pauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"}],\"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\":\"StrategyWithdrawalDelayBlocksSet\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"previousValue\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"newValue\",\"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\":\"event\",\"name\":\"WithdrawalCompleted\",\"inputs\":[{\"name\":\"withdrawalRoot\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"WithdrawalQueued\",\"inputs\":[{\"name\":\"withdrawalRoot\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"withdrawal\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIDelegationManager.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\":\"shares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]}],\"anonymous\":false}]", - Bin: "0x6101006040523480156200001257600080fd5b5060405162005c4638038062005c46833981016040819052620000359162000140565b6001600160a01b0380841660805280821660c052821660a0526200005862000065565b50504660e0525062000194565b600054610100900460ff1615620000d25760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101562000125576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146200013d57600080fd5b50565b6000806000606084860312156200015657600080fd5b8351620001638162000127565b6020850151909350620001768162000127565b6040850151909250620001898162000127565b809150509250925092565b60805160a05160c05160e051615a1d6200022960003960006126a00152600081816105b10152818161102e015281816113aa01528181611c23015281816129f901528181613eac0152614398015260006107620152600081816104f901528181610ffc0152818161137801528181611cb701528181612ac601528181612c4901528181613fd2015261443e0152615a1d6000f3fe608060405234801561001057600080fd5b50600436106103425760003560e01c8063635bbd10116101b8578063b7f06ebe11610104578063cf80873e116100a2578063f16172b01161007c578063f16172b014610908578063f2fde38b1461091b578063f698da251461092e578063fabc1cbc1461093657600080fd5b8063cf80873e146108c1578063da8be864146108e2578063eea9064b146108f557600080fd5b8063c488375a116100de578063c488375a146107de578063c5e480db146107fe578063c94b5111146108a4578063ca661c04146108b757600080fd5b8063b7f06ebe14610784578063bb45fef2146107a7578063c448feb8146107d557600080fd5b8063886f1195116101715780639104c3191161014b5780639104c3191461070f57806399be81c81461072a578063a17884841461073d578063b13442711461075d57600080fd5b8063886f1195146106cb5780638da5cb5b146106de57806390041347146106ef57600080fd5b8063635bbd101461063657806365da1264146106495780636d70f7ae14610672578063715018a614610685578063778e55f31461068d5780637f548071146106b857600080fd5b806328a573ae116102925780634665bcda11610230578063597b36da1161020a578063597b36da146105e55780635ac86ab7146105f85780635c975abb1461061b57806360d7faed1461062357600080fd5b80634665bcda146105ac5780634fc40b61146105d3578063595c6a67146105dd57600080fd5b806339b70e381161026c57806339b70e38146104f45780633cdeb5e0146105335780633e28391d14610562578063433773821461058557600080fd5b806328a573ae146104ae57806329c77d4f146104c157806333404396146104e157600080fd5b8063132d4967116102ff57806316928365116102d957806316928365146104285780631bbce0911461046157806320606b701461047457806322bf40e41461049b57600080fd5b8063132d4967146103ef578063136439dd146104025780631522bf021461041557600080fd5b80630449ca391461034757806304a4f9791461036d5780630b9f487a146103945780630dd8dd02146103a75780630f589e59146103c757806310d67a2f146103dc575b600080fd5b61035a61035536600461484e565b610949565b6040519081526020015b60405180910390f35b61035a7f14bde674c9f64b2ad00eaaee4a8bed1fabef35c7507e3c5b9cfc9436909a2dad81565b61035a6103a23660046148b4565b6109ce565b6103ba6103b536600461484e565b610a90565b604051610364919061490f565b6103da6103d53660046149ac565b610df9565b005b6103da6103ea3660046149ff565b610f3e565b6103da6103fd366004614a23565b610ff1565b6103da610410366004614a64565b6110a8565b6103da610423366004614a7d565b6111e7565b61035a6104363660046149ff565b6001600160a01b0316600090815260996020526040902060010154600160a01b900463ffffffff1690565b61035a61046f366004614a23565b6111fb565b61035a7f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b6103da6104a9366004614ae8565b611229565b6103da6104bc366004614a23565b61136d565b61035a6104cf3660046149ff565b609b6020526000908152604090205481565b6103da6104ef366004614b8f565b61141d565b61051b7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610364565b61051b6105413660046149ff565b6001600160a01b039081166000908152609960205260409020600101541690565b6105756105703660046149ff565b61155a565b6040519015158152602001610364565b61035a7f39111bc4a4d688e1f685123d7497d4615370152a8ee4a0593e647bd06ad8bb0b81565b61051b7f000000000000000000000000000000000000000000000000000000000000000081565b61035a6213c68081565b6103da61157a565b61035a6105f3366004614e8c565b611641565b610575610606366004614ec8565b606654600160ff9092169190911b9081161490565b60665461035a565b6103da610631366004614ef9565b611671565b6103da610644366004614a64565b61170c565b61051b6106573660046149ff565b609a602052600090815260409020546001600160a01b031681565b6105756106803660046149ff565b61171d565b6103da611757565b61035a61069b366004614f88565b609860209081526000928352604080842090915290825290205481565b6103da6106c6366004615069565b61176b565b60655461051b906001600160a01b031681565b6033546001600160a01b031661051b565b6107026106fd3660046150f9565b611997565b6040516103649190615183565b61051b73beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac081565b6103da610738366004615196565b611a71565b61035a61074b3660046149ff565b609f6020526000908152604090205481565b61051b7f000000000000000000000000000000000000000000000000000000000000000081565b610575610792366004614a64565b609e6020526000908152604090205460ff1681565b6105756107b53660046151cb565b609c60209081526000928352604080842090915290825290205460ff1681565b61035a609d5481565b61035a6107ec3660046149ff565b60a16020526000908152604090205481565b61086e61080c3660046149ff565b6040805160608082018352600080835260208084018290529284018190526001600160a01b03948516815260998352839020835191820184528054851682526001015493841691810191909152600160a01b90920463ffffffff169082015290565b6040805182516001600160a01b039081168252602080850151909116908201529181015163ffffffff1690820152606001610364565b61035a6108b23660046151f7565b611b43565b61035a62034bc081565b6108d46108cf3660046149ff565b611bfc565b604051610364929190615278565b6103ba6108f03660046149ff565b611fb4565b6103da61090336600461529d565b612478565b6103da6109163660046152f5565b612595565b6103da6109293660046149ff565b612626565b61035a61269c565b6103da610944366004614a64565b6126da565b609d54600090815b838110156109c657600060a1600087878581811061097157610971615311565b905060200201602081019061098691906149ff565b6001600160a01b03166001600160a01b03168152602001908152602001600020549050828111156109b5578092505b506109bf8161533d565b9050610951565b509392505050565b604080517f14bde674c9f64b2ad00eaaee4a8bed1fabef35c7507e3c5b9cfc9436909a2dad6020808301919091526001600160a01b038681168385015288811660608401528716608083015260a0820185905260c08083018590528351808403909101815260e0909201909252805191012060009081610a4c61269c565b60405161190160f01b602082015260228101919091526042810183905260620160408051808303601f19018152919052805160209091012098975050505050505050565b60665460609060019060029081161415610ac55760405162461bcd60e51b8152600401610abc90615358565b60405180910390fd5b6000836001600160401b03811115610adf57610adf614c31565b604051908082528060200260200182016040528015610b08578160200160208202803683370190505b50336000908152609a60205260408120549192506001600160a01b03909116905b85811015610dee57868682818110610b4357610b43615311565b9050602002810190610b55919061538f565b610b639060208101906153af565b9050878783818110610b7757610b77615311565b9050602002810190610b89919061538f565b610b9390806153af565b905014610c085760405162461bcd60e51b815260206004820152603860248201527f44656c65676174696f6e4d616e616765722e717565756557697468647261776160448201527f6c3a20696e707574206c656e677468206d69736d6174636800000000000000006064820152608401610abc565b33878783818110610c1b57610c1b615311565b9050602002810190610c2d919061538f565b610c3e9060608101906040016149ff565b6001600160a01b031614610cba5760405162461bcd60e51b815260206004820152603c60248201527f44656c65676174696f6e4d616e616765722e717565756557697468647261776160448201527f6c3a2077697468647261776572206d757374206265207374616b6572000000006064820152608401610abc565b610dbf3383898985818110610cd157610cd1615311565b9050602002810190610ce3919061538f565b610cf49060608101906040016149ff565b8a8a86818110610d0657610d06615311565b9050602002810190610d18919061538f565b610d2290806153af565b808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508e92508d9150889050818110610d6857610d68615311565b9050602002810190610d7a919061538f565b610d889060208101906153af565b8080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061283692505050565b838281518110610dd157610dd1615311565b602090810291909101015280610de68161533d565b915050610b29565b509095945050505050565b610e023361155a565b15610e885760405162461bcd60e51b815260206004820152604a60248201527f44656c65676174696f6e4d616e616765722e726567697374657241734f70657260448201527f61746f723a2063616c6c657220697320616c7265616479206163746976656c796064820152690819195b1959d85d195960b21b608482015260a401610abc565b610e923384612df6565b604080518082019091526060815260006020820152610eb43380836000612fe9565b336001600160a01b03167f8e8485583a2310d41f7c82b9427d0bd49bad74bb9cff9d3402a29d8f9b28a0e285604051610eed91906153f8565b60405180910390a2336001600160a01b03167f02a919ed0e2acad1dd90f17ef2fa4ae5462ee1339170034a8531cca4b67080908484604051610f3092919061544a565b60405180910390a250505050565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f91573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fb59190615479565b6001600160a01b0316336001600160a01b031614610fe55760405162461bcd60e51b8152600401610abc90615496565b610fee8161327f565b50565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806110505750336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016145b61106c5760405162461bcd60e51b8152600401610abc906154e0565b6110758361155a565b156110a3576001600160a01b038084166000908152609a6020526040902054166110a181858585613376565b505b505050565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa1580156110f0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611114919061553d565b6111305760405162461bcd60e51b8152600401610abc9061555a565b606654818116146111a95760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c69747900000000000000006064820152608401610abc565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b6111ef6133f1565b6110a18484848461344b565b6001600160a01b0383166000908152609b602052604081205461122085828686611b43565b95945050505050565b600054610100900460ff16158080156112495750600054600160ff909116105b806112635750303b158015611263575060005460ff166001145b6112c65760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610abc565b6000805460ff1916600117905580156112e9576000805461ff0019166101001790555b6112f38888613671565b6112fb61375b565b609755611307896137f2565b61131086613844565b61131c8585858561344b565b8015611362576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806113cc5750336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016145b6113e85760405162461bcd60e51b8152600401610abc906154e0565b6113f18361155a565b156110a3576001600160a01b038084166000908152609a6020526040902054166110a18185858561393e565b606654600290600490811614156114465760405162461bcd60e51b8152600401610abc90615358565b600260c95414156114995760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610abc565b600260c95560005b88811015611549576115398a8a838181106114be576114be615311565b90506020028101906114d091906155a2565b8989848181106114e2576114e2615311565b90506020028101906114f491906153af565b89898681811061150657611506615311565b9050602002013588888781811061151f5761151f615311565b905060200201602081019061153491906155b8565b6139b9565b6115428161533d565b90506114a1565b5050600160c9555050505050505050565b6001600160a01b039081166000908152609a602052604090205416151590565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa1580156115c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115e6919061553d565b6116025760405162461bcd60e51b8152600401610abc9061555a565b600019606681905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b6000816040516020016116549190615649565b604051602081830303815290604052805190602001209050919050565b6066546002906004908116141561169a5760405162461bcd60e51b8152600401610abc90615358565b600260c95414156116ed5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610abc565b600260c9556116ff86868686866139b9565b5050600160c95550505050565b6117146133f1565b610fee81613844565b60006001600160a01b0382161580159061175157506001600160a01b038083166000818152609a6020526040902054909116145b92915050565b61175f6133f1565b61176960006137f2565b565b42836020015110156117ef5760405162461bcd60e51b815260206004820152604160248201527f44656c65676174696f6e4d616e616765722e64656c6567617465546f4279536960448201527f676e61747572653a207374616b6572207369676e6174757265206578706972656064820152601960fa1b608482015260a401610abc565b6117f88561155a565b156118815760405162461bcd60e51b815260206004820152604d60248201527f44656c65676174696f6e4d616e616765722e64656c6567617465546f4279536960448201527f676e61747572653a207374616b657220697320616c726561647920616374697660648201526c195b1e4819195b1959d85d1959609a1b608482015260a401610abc565b61188a8461171d565b6119165760405162461bcd60e51b815260206004820152605160248201527f44656c65676174696f6e4d616e616765722e64656c6567617465546f4279536960448201527f676e61747572653a206f70657261746f72206973206e6f7420726567697374656064820152703932b21034b71022b4b3b2b72630bcb2b960791b608482015260a401610abc565b6000609b6000876001600160a01b03166001600160a01b0316815260200190815260200160002054905060006119528783888860200151611b43565b6001600160a01b0388166000908152609b60205260409020600184019055855190915061198290889083906141a3565b61198e87878686612fe9565b50505050505050565b6060600082516001600160401b038111156119b4576119b4614c31565b6040519080825280602002602001820160405280156119dd578160200160208202803683370190505b50905060005b83518110156109c6576001600160a01b03851660009081526098602052604081208551909190869084908110611a1b57611a1b615311565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002054828281518110611a5657611a56615311565b6020908102919091010152611a6a8161533d565b90506119e3565b611a7a3361171d565b611afc5760405162461bcd60e51b815260206004820152604760248201527f44656c65676174696f6e4d616e616765722e7570646174654f70657261746f7260448201527f4d657461646174615552493a2063616c6c6572206d75737420626520616e206f6064820152663832b930ba37b960c91b608482015260a401610abc565b336001600160a01b03167f02a919ed0e2acad1dd90f17ef2fa4ae5462ee1339170034a8531cca4b67080908383604051611b3792919061544a565b60405180910390a25050565b604080517f39111bc4a4d688e1f685123d7497d4615370152a8ee4a0593e647bd06ad8bb0b6020808301919091526001600160a01b0387811683850152851660608301526080820186905260a08083018590528351808403909101815260c0909201909252805191012060009081611bb961269c565b60405161190160f01b602082015260228101919091526042810183905260620160408051808303601f190181529190528051602090910120979650505050505050565b6040516360f4062b60e01b81526001600160a01b03828116600483015260609182916000917f0000000000000000000000000000000000000000000000000000000000000000909116906360f4062b90602401602060405180830381865afa158015611c6c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c90919061565c565b6040516394f649dd60e01b81526001600160a01b03868116600483015291925060009182917f0000000000000000000000000000000000000000000000000000000000000000909116906394f649dd90602401600060405180830381865afa158015611d00573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611d2891908101906156d0565b9150915060008313611d3f57909590945092505050565b606080835160001415611df9576040805160018082528183019092529060208083019080368337505060408051600180825281830190925292945090506020808301908036833701905050905073beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac082600081518110611db457611db4615311565b60200260200101906001600160a01b031690816001600160a01b0316815250508481600081518110611de857611de8615311565b602002602001018181525050611fa7565b8351611e0690600161578a565b6001600160401b03811115611e1d57611e1d614c31565b604051908082528060200260200182016040528015611e46578160200160208202803683370190505b50915081516001600160401b03811115611e6257611e62614c31565b604051908082528060200260200182016040528015611e8b578160200160208202803683370190505b50905060005b8451811015611f2557848181518110611eac57611eac615311565b6020026020010151838281518110611ec657611ec6615311565b60200260200101906001600160a01b031690816001600160a01b031681525050838181518110611ef857611ef8615311565b6020026020010151828281518110611f1257611f12615311565b6020908102919091010152600101611e91565b5073beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac08260018451611f4a91906157a2565b81518110611f5a57611f5a615311565b60200260200101906001600160a01b031690816001600160a01b031681525050848160018451611f8a91906157a2565b81518110611f9a57611f9a615311565b6020026020010181815250505b9097909650945050505050565b60665460609060019060029081161415611fe05760405162461bcd60e51b8152600401610abc90615358565b611fe98361155a565b6120695760405162461bcd60e51b8152602060048201526044602482018190527f44656c65676174696f6e4d616e616765722e756e64656c65676174653a207374908201527f616b6572206d7573742062652064656c65676174656420746f20756e64656c656064820152636761746560e01b608482015260a401610abc565b6120728361171d565b156120e55760405162461bcd60e51b815260206004820152603d60248201527f44656c65676174696f6e4d616e616765722e756e64656c65676174653a206f7060448201527f657261746f72732063616e6e6f7420626520756e64656c6567617465640000006064820152608401610abc565b6001600160a01b0383166121615760405162461bcd60e51b815260206004820152603c60248201527f44656c65676174696f6e4d616e616765722e756e64656c65676174653a20636160448201527f6e6e6f7420756e64656c6567617465207a65726f2061646472657373000000006064820152608401610abc565b6001600160a01b038084166000818152609a6020526040902054909116903314806121945750336001600160a01b038216145b806121bb57506001600160a01b038181166000908152609960205260409020600101541633145b61222d5760405162461bcd60e51b815260206004820152603d60248201527f44656c65676174696f6e4d616e616765722e756e64656c65676174653a20636160448201527f6c6c65722063616e6e6f7420756e64656c6567617465207374616b65720000006064820152608401610abc565b60008061223986611bfc565b9092509050336001600160a01b0387161461228f57826001600160a01b0316866001600160a01b03167ff0eddf07e6ea14f388b47e1e94a0f464ecbd9eed4171130e0fc0e99fb4030a8a60405160405180910390a35b826001600160a01b0316866001600160a01b03167ffee30966a256b71e14bc0ebfc94315e28ef4a97a7131a9e2b7a310a73af4467660405160405180910390a36001600160a01b0386166000908152609a6020526040902080546001600160a01b0319169055815161231157604080516000815260208101909152945061246f565b81516001600160401b0381111561232a5761232a614c31565b604051908082528060200260200182016040528015612353578160200160208202803683370190505b50945060005b825181101561246d576040805160018082528183019092526000916020808301908036833750506040805160018082528183019092529293506000929150602080830190803683370190505090508483815181106123b9576123b9615311565b6020026020010151826000815181106123d4576123d4615311565b60200260200101906001600160a01b031690816001600160a01b03168152505083838151811061240657612406615311565b60200260200101518160008151811061242157612421615311565b60200260200101818152505061243a89878b8585612836565b88848151811061244c5761244c615311565b602002602001018181525050505080806124659061533d565b915050612359565b505b50505050919050565b6124813361155a565b156124ff5760405162461bcd60e51b815260206004820152604260248201527f44656c65676174696f6e4d616e616765722e64656c6567617465546f3a20737460448201527f616b657220697320616c7265616479206163746976656c792064656c65676174606482015261195960f21b608482015260a401610abc565b6125088361171d565b6125895760405162461bcd60e51b815260206004820152604660248201527f44656c65676174696f6e4d616e616765722e64656c6567617465546f3a206f7060448201527f657261746f72206973206e6f74207265676973746572656420696e2045696765606482015265372630bcb2b960d11b608482015260a401610abc565b6110a333848484612fe9565b61259e3361171d565b61261c5760405162461bcd60e51b815260206004820152604360248201527f44656c65676174696f6e4d616e616765722e6d6f646966794f70657261746f7260448201527f44657461696c733a2063616c6c6572206d75737420626520616e206f706572616064820152623a37b960e91b608482015260a401610abc565b610fee3382612df6565b61262e6133f1565b6001600160a01b0381166126935760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610abc565b610fee816137f2565b60007f00000000000000000000000000000000000000000000000000000000000000004614156126cd575060975490565b6126d561375b565b905090565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561272d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127519190615479565b6001600160a01b0316336001600160a01b0316146127815760405162461bcd60e51b8152600401610abc90615496565b6066541981196066541916146127ff5760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c69747900000000000000006064820152608401610abc565b606681905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c906020016111dc565b60006001600160a01b0386166128cd5760405162461bcd60e51b815260206004820152605060248201527f44656c65676174696f6e4d616e616765722e5f72656d6f76655368617265734160448201527f6e6451756575655769746864726177616c3a207374616b65722063616e6e6f7460648201526f206265207a65726f206164647265737360801b608482015260a401610abc565b82516129575760405162461bcd60e51b815260206004820152604d60248201527f44656c65676174696f6e4d616e616765722e5f72656d6f76655368617265734160448201527f6e6451756575655769746864726177616c3a207374726174656769657320636160648201526c6e6e6f7420626520656d70747960981b608482015260a401610abc565b60005b8351811015612d04576001600160a01b038616156129b0576129b0868886848151811061298957612989615311565b60200260200101518685815181106129a3576129a3615311565b6020026020010151613376565b73beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac06001600160a01b03168482815181106129e0576129e0615311565b60200260200101516001600160a01b03161415612aa9577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663beffbb8988858481518110612a3957612a39615311565b60200260200101516040518363ffffffff1660e01b8152600401612a729291906001600160a01b03929092168252602082015260400190565b600060405180830381600087803b158015612a8c57600080fd5b505af1158015612aa0573d6000803e3d6000fd5b50505050612cfc565b846001600160a01b0316876001600160a01b03161480612b7b57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316639b4da03d858381518110612b0557612b05615311565b60200260200101516040518263ffffffff1660e01b8152600401612b3891906001600160a01b0391909116815260200190565b602060405180830381865afa158015612b55573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b79919061553d565b155b612c475760405162461bcd60e51b8152602060048201526084602482018190527f44656c65676174696f6e4d616e616765722e5f72656d6f76655368617265734160448301527f6e6451756575655769746864726177616c3a2077697468647261776572206d7560648301527f73742062652073616d652061646472657373206173207374616b657220696620908201527f746869726450617274795472616e7366657273466f7262696464656e2061726560a482015263081cd95d60e21b60c482015260e401610abc565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316638c80d4e588868481518110612c8957612c89615311565b6020026020010151868581518110612ca357612ca3615311565b60200260200101516040518463ffffffff1660e01b8152600401612cc9939291906157b9565b600060405180830381600087803b158015612ce357600080fd5b505af1158015612cf7573d6000803e3d6000fd5b505050505b60010161295a565b506001600160a01b0386166000908152609f60205260408120805491829190612d2c8361533d565b919050555060006040518060e00160405280896001600160a01b03168152602001886001600160a01b03168152602001876001600160a01b031681526020018381526020014363ffffffff1681526020018681526020018581525090506000612d9482611641565b6000818152609e602052604090819020805460ff19166001179055519091507f9009ab153e8014fbfb02f2217f5cde7aa7f9ad734ae85ca3ee3f4ca2fdd499f990612de290839085906157dd565b60405180910390a198975050505050505050565b6213c680612e0a60608301604084016157f6565b63ffffffff161115612ebf5760405162461bcd60e51b815260206004820152606c60248201527f44656c65676174696f6e4d616e616765722e5f7365744f70657261746f72446560448201527f7461696c733a207374616b65724f70744f757457696e646f77426c6f636b732060648201527f63616e6e6f74206265203e204d41585f5354414b45525f4f50545f4f55545f5760848201526b494e444f575f424c4f434b5360a01b60a482015260c401610abc565b6001600160a01b0382166000908152609960205260409081902060010154600160a01b900463ffffffff1690612efb90606084019084016157f6565b63ffffffff161015612f915760405162461bcd60e51b815260206004820152605360248201527f44656c65676174696f6e4d616e616765722e5f7365744f70657261746f72446560448201527f7461696c733a207374616b65724f70744f757457696e646f77426c6f636b732060648201527218d85b9b9bdd08189948191958dc99585cd959606a1b608482015260a401610abc565b6001600160a01b03821660009081526099602052604090208190612fb58282615833565b505060405133907ffebe5cd24b2cbc7b065b9d0fdeb904461e4afcff57dd57acda1e7832031ba7ac90611b379084906153f8565b606654600090600190811614156130125760405162461bcd60e51b8152600401610abc90615358565b6001600160a01b038085166000908152609960205260409020600101541680158015906130485750336001600160a01b03821614155b801561305d5750336001600160a01b03861614155b156131ca5742846020015110156130dc5760405162461bcd60e51b815260206004820152603760248201527f44656c65676174696f6e4d616e616765722e5f64656c65676174653a2061707060448201527f726f766572207369676e617475726520657870697265640000000000000000006064820152608401610abc565b6001600160a01b0381166000908152609c6020908152604080832086845290915290205460ff16156131765760405162461bcd60e51b815260206004820152603760248201527f44656c65676174696f6e4d616e616765722e5f64656c65676174653a2061707060448201527f726f76657253616c7420616c7265616479207370656e740000000000000000006064820152608401610abc565b6001600160a01b0381166000908152609c6020908152604080832086845282528220805460ff191660011790558501516131b79088908890859088906109ce565b90506131c8828287600001516141a3565b505b6001600160a01b038681166000818152609a602052604080822080546001600160a01b031916948a169485179055517fc3ee9f2e5fda98e8066a1f745b2df9285f416fe98cf2559cd21484b3d87433049190a360008061322988611bfc565b9150915060005b825181101561136257613277888a85848151811061325057613250615311565b602002602001015185858151811061326a5761326a615311565b602002602001015161393e565b600101613230565b6001600160a01b03811661330d5760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a401610abc565b606554604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1606580546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b038085166000908152609860209081526040808320938616835292905290812080548392906133ad9084906157a2565b92505081905550836001600160a01b03167f6909600037b75d7b4733aedd815442b5ec018a827751c832aaff64eba5d6d2dd848484604051610f30939291906157b9565b6033546001600160a01b031633146117695760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610abc565b8281146134d35760405162461bcd60e51b815260206004820152604a60248201527f44656c65676174696f6e4d616e616765722e5f7365745374726174656779576960448201527f746864726177616c44656c6179426c6f636b733a20696e707574206c656e67746064820152690d040dad2e6dac2e8c6d60b31b608482015260a401610abc565b8260005b818110156136695760008686838181106134f3576134f3615311565b905060200201602081019061350891906149ff565b6001600160a01b038116600090815260a1602052604081205491925086868581811061353657613536615311565b90506020020135905062034bc08111156135fa5760405162461bcd60e51b815260206004820152607360248201527f44656c65676174696f6e4d616e616765722e5f7365745374726174656779576960448201527f746864726177616c44656c6179426c6f636b733a205f7769746864726177616c60648201527f44656c6179426c6f636b732063616e6e6f74206265203e204d41585f5749544860848201527244524157414c5f44454c41595f424c4f434b5360681b60a482015260c401610abc565b6001600160a01b038316600081815260a160209081526040918290208490558151928352820184905281018290527f0e7efa738e8b0ce6376a0c1af471655540d2e9a81647d7b09ed823018426576d9060600160405180910390a1505050806136629061533d565b90506134d7565b505050505050565b6065546001600160a01b031615801561369257506001600160a01b03821615155b6137145760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a401610abc565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a26137578261327f565b5050565b604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b62034bc08111156138fd5760405162461bcd60e51b815260206004820152607160248201527f44656c65676174696f6e4d616e616765722e5f7365744d696e5769746864726160448201527f77616c44656c6179426c6f636b733a205f6d696e5769746864726177616c446560648201527f6c6179426c6f636b732063616e6e6f74206265203e204d41585f5749544844526084820152704157414c5f44454c41595f424c4f434b5360781b60a482015260c401610abc565b609d5460408051918252602082018390527fafa003cd76f87ff9d62b35beea889920f33c0c42b8d45b74954d61d50f4b6b69910160405180910390a1609d55565b6001600160a01b0380851660009081526098602090815260408083209386168352929052908120805483929061397590849061578a565b92505081905550836001600160a01b03167f1ec042c965e2edd7107b51188ee0f383e22e76179041ab3a9d18ff151405166c848484604051610f30939291906157b9565b60006139c76105f387615896565b6000818152609e602052604090205490915060ff16613a485760405162461bcd60e51b815260206004820152604360248201526000805160206159c883398151915260448201527f645769746864726177616c3a20616374696f6e206973206e6f7420696e20717560648201526265756560e81b608482015260a401610abc565b609d544390613a5d60a0890160808a016157f6565b63ffffffff16613a6d919061578a565b1115613af55760405162461bcd60e51b815260206004820152605f60248201526000805160206159c883398151915260448201527f645769746864726177616c3a206d696e5769746864726177616c44656c61794260648201527f6c6f636b7320706572696f6420686173206e6f74207965742070617373656400608482015260a401610abc565b613b0560608701604088016149ff565b6001600160a01b0316336001600160a01b031614613b925760405162461bcd60e51b815260206004820152605060248201526000805160206159c883398151915260448201527f645769746864726177616c3a206f6e6c7920776974686472617765722063616e60648201526f1031b7b6b83632ba329030b1ba34b7b760811b608482015260a401610abc565b8115613c1457613ba560a08701876153af565b85149050613c145760405162461bcd60e51b815260206004820152604260248201526000805160206159c883398151915260448201527f645769746864726177616c3a20696e707574206c656e677468206d69736d61746064820152610c6d60f31b608482015260a401610abc565b6000818152609e60205260409020805460ff191690558115613d795760005b613c4060a08801886153af565b9050811015613d73574360a16000613c5b60a08b018b6153af565b85818110613c6b57613c6b615311565b9050602002016020810190613c8091906149ff565b6001600160a01b03168152602081019190915260400160002054613caa60a08a0160808b016157f6565b63ffffffff16613cba919061578a565b1115613cd85760405162461bcd60e51b8152600401610abc906158a2565b613d6b613ce860208901896149ff565b33613cf660a08b018b6153af565b85818110613d0657613d06615311565b9050602002016020810190613d1b91906149ff565b613d2860c08c018c6153af565b86818110613d3857613d38615311565b905060200201358a8a87818110613d5157613d51615311565b9050602002016020810190613d6691906149ff565b61435d565b600101613c33565b50614168565b336000908152609a60205260408120546001600160a01b0316905b613da160a08901896153af565b9050811015614165574360a16000613dbc60a08c018c6153af565b85818110613dcc57613dcc615311565b9050602002016020810190613de191906149ff565b6001600160a01b03168152602081019190915260400160002054613e0b60a08b0160808c016157f6565b63ffffffff16613e1b919061578a565b1115613e395760405162461bcd60e51b8152600401610abc906158a2565b73beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac0613e5b60a08a018a6153af565b83818110613e6b57613e6b615311565b9050602002016020810190613e8091906149ff565b6001600160a01b03161415613fd0576000613e9e60208a018a6149ff565b905060006001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016630e81073c83613edf60c08e018e6153af565b87818110613eef57613eef615311565b6040516001600160e01b031960e087901b1681526001600160a01b03909416600485015260200291909101356024830152506044016020604051808303816000875af1158015613f43573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f67919061565c565b6001600160a01b038084166000908152609a6020526040902054919250168015613fc857613fc88184613f9d60a08f018f6153af565b88818110613fad57613fad615311565b9050602002016020810190613fc291906149ff565b8561393e565b50505061415d565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663c4623ea13389898581811061401257614012615311565b905060200201602081019061402791906149ff565b61403460a08d018d6153af565b8681811061404457614044615311565b905060200201602081019061405991906149ff565b61406660c08e018e6153af565b8781811061407657614076615311565b60405160e088901b6001600160e01b03191681526001600160a01b03968716600482015294861660248601529290941660448401526020909102013560648201526084019050600060405180830381600087803b1580156140d657600080fd5b505af11580156140ea573d6000803e3d6000fd5b505050506001600160a01b0382161561415d5761415d823361410f60a08c018c6153af565b8581811061411f5761411f615311565b905060200201602081019061413491906149ff565b61414160c08d018d6153af565b8681811061415157614151615311565b9050602002013561393e565b600101613d94565b50505b6040518181527fc97098c2f658800b4df29001527f7324bcdffcf6e8751a699ab920a1eced5b1d9060200160405180910390a1505050505050565b6001600160a01b0383163b156142bd57604051630b135d3f60e11b808252906001600160a01b03851690631626ba7e906141e3908690869060040161592a565b602060405180830381865afa158015614200573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906142249190615987565b6001600160e01b031916146110a35760405162461bcd60e51b815260206004820152605360248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a2045524331323731207369676e6174757265206064820152721d995c9a599a58d85d1a5bdb8819985a5b1959606a1b608482015260a401610abc565b826001600160a01b03166142d1838361449d565b6001600160a01b0316146110a35760405162461bcd60e51b815260206004820152604760248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a207369676e6174757265206e6f742066726f6d6064820152661039b4b3b732b960c91b608482015260a401610abc565b6001600160a01b03831673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac014156144085760405162387b1360e81b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063387b1300906143d1908890889087906004016157b9565b600060405180830381600087803b1580156143eb57600080fd5b505af11580156143ff573d6000803e3d6000fd5b50505050614496565b60405163c608c7f360e01b81526001600160a01b03858116600483015284811660248301526044820184905282811660648301527f0000000000000000000000000000000000000000000000000000000000000000169063c608c7f390608401600060405180830381600087803b15801561448257600080fd5b505af1158015611362573d6000803e3d6000fd5b5050505050565b60008060006144ac85856144b9565b915091506109c681614529565b6000808251604114156144f05760208301516040840151606085015160001a6144e4878285856146e4565b94509450505050614522565b82516040141561451a576020830151604084015161450f8683836147d1565b935093505050614522565b506000905060025b9250929050565b600081600481111561453d5761453d6159b1565b14156145465750565b600181600481111561455a5761455a6159b1565b14156145a85760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610abc565b60028160048111156145bc576145bc6159b1565b141561460a5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610abc565b600381600481111561461e5761461e6159b1565b14156146775760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610abc565b600481600481111561468b5761468b6159b1565b1415610fee5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610abc565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561471b57506000905060036147c8565b8460ff16601b1415801561473357508460ff16601c14155b1561474457506000905060046147c8565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015614798573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166147c1576000600192509250506147c8565b9150600090505b94509492505050565b6000806001600160ff1b038316816147ee60ff86901c601b61578a565b90506147fc878288856146e4565b935093505050935093915050565b60008083601f84011261481c57600080fd5b5081356001600160401b0381111561483357600080fd5b6020830191508360208260051b850101111561452257600080fd5b6000806020838503121561486157600080fd5b82356001600160401b0381111561487757600080fd5b6148838582860161480a565b90969095509350505050565b6001600160a01b0381168114610fee57600080fd5b80356148af8161488f565b919050565b600080600080600060a086880312156148cc57600080fd5b85356148d78161488f565b945060208601356148e78161488f565b935060408601356148f78161488f565b94979396509394606081013594506080013592915050565b6020808252825182820181905260009190848201906040850190845b818110156149475783518352928401929184019160010161492b565b50909695505050505050565b60006060828403121561496557600080fd5b50919050565b60008083601f84011261497d57600080fd5b5081356001600160401b0381111561499457600080fd5b60208301915083602082850101111561452257600080fd5b6000806000608084860312156149c157600080fd5b6149cb8585614953565b925060608401356001600160401b038111156149e657600080fd5b6149f28682870161496b565b9497909650939450505050565b600060208284031215614a1157600080fd5b8135614a1c8161488f565b9392505050565b600080600060608486031215614a3857600080fd5b8335614a438161488f565b92506020840135614a538161488f565b929592945050506040919091013590565b600060208284031215614a7657600080fd5b5035919050565b60008060008060408587031215614a9357600080fd5b84356001600160401b0380821115614aaa57600080fd5b614ab68883890161480a565b90965094506020870135915080821115614acf57600080fd5b50614adc8782880161480a565b95989497509550505050565b60008060008060008060008060c0898b031215614b0457600080fd5b8835614b0f8161488f565b97506020890135614b1f8161488f565b9650604089013595506060890135945060808901356001600160401b0380821115614b4957600080fd5b614b558c838d0161480a565b909650945060a08b0135915080821115614b6e57600080fd5b50614b7b8b828c0161480a565b999c989b5096995094979396929594505050565b6000806000806000806000806080898b031215614bab57600080fd5b88356001600160401b0380821115614bc257600080fd5b614bce8c838d0161480a565b909a50985060208b0135915080821115614be757600080fd5b614bf38c838d0161480a565b909850965060408b0135915080821115614c0c57600080fd5b614c188c838d0161480a565b909650945060608b0135915080821115614b6e57600080fd5b634e487b7160e01b600052604160045260246000fd5b60405160e081016001600160401b0381118282101715614c6957614c69614c31565b60405290565b604080519081016001600160401b0381118282101715614c6957614c69614c31565b604051601f8201601f191681016001600160401b0381118282101715614cb957614cb9614c31565b604052919050565b63ffffffff81168114610fee57600080fd5b80356148af81614cc1565b60006001600160401b03821115614cf757614cf7614c31565b5060051b60200190565b600082601f830112614d1257600080fd5b81356020614d27614d2283614cde565b614c91565b82815260059290921b84018101918181019086841115614d4657600080fd5b8286015b84811015614d6a578035614d5d8161488f565b8352918301918301614d4a565b509695505050505050565b600082601f830112614d8657600080fd5b81356020614d96614d2283614cde565b82815260059290921b84018101918181019086841115614db557600080fd5b8286015b84811015614d6a5780358352918301918301614db9565b600060e08284031215614de257600080fd5b614dea614c47565b9050614df5826148a4565b8152614e03602083016148a4565b6020820152614e14604083016148a4565b604082015260608201356060820152614e2f60808301614cd3565b608082015260a08201356001600160401b0380821115614e4e57600080fd5b614e5a85838601614d01565b60a084015260c0840135915080821115614e7357600080fd5b50614e8084828501614d75565b60c08301525092915050565b600060208284031215614e9e57600080fd5b81356001600160401b03811115614eb457600080fd5b614ec084828501614dd0565b949350505050565b600060208284031215614eda57600080fd5b813560ff81168114614a1c57600080fd5b8015158114610fee57600080fd5b600080600080600060808688031215614f1157600080fd5b85356001600160401b0380821115614f2857600080fd5b9087019060e0828a031215614f3c57600080fd5b90955060208701359080821115614f5257600080fd5b50614f5f8882890161480a565b909550935050604086013591506060860135614f7a81614eeb565b809150509295509295909350565b60008060408385031215614f9b57600080fd5b8235614fa68161488f565b91506020830135614fb68161488f565b809150509250929050565b600060408284031215614fd357600080fd5b614fdb614c6f565b905081356001600160401b0380821115614ff457600080fd5b818401915084601f83011261500857600080fd5b813560208282111561501c5761501c614c31565b61502e601f8301601f19168201614c91565b9250818352868183860101111561504457600080fd5b8181850182850137600081838501015282855280860135818601525050505092915050565b600080600080600060a0868803121561508157600080fd5b853561508c8161488f565b9450602086013561509c8161488f565b935060408601356001600160401b03808211156150b857600080fd5b6150c489838a01614fc1565b945060608801359150808211156150da57600080fd5b506150e788828901614fc1565b95989497509295608001359392505050565b6000806040838503121561510c57600080fd5b82356151178161488f565b915060208301356001600160401b0381111561513257600080fd5b61513e85828601614d01565b9150509250929050565b600081518084526020808501945080840160005b838110156151785781518752958201959082019060010161515c565b509495945050505050565b602081526000614a1c6020830184615148565b600080602083850312156151a957600080fd5b82356001600160401b038111156151bf57600080fd5b6148838582860161496b565b600080604083850312156151de57600080fd5b82356151e98161488f565b946020939093013593505050565b6000806000806080858703121561520d57600080fd5b84356152188161488f565b935060208501359250604085013561522f8161488f565b9396929550929360600135925050565b600081518084526020808501945080840160005b838110156151785781516001600160a01b031687529582019590820190600101615253565b60408152600061528b604083018561523f565b82810360208401526112208185615148565b6000806000606084860312156152b257600080fd5b83356152bd8161488f565b925060208401356001600160401b038111156152d857600080fd5b6152e486828701614fc1565b925050604084013590509250925092565b60006060828403121561530757600080fd5b614a1c8383614953565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060001982141561535157615351615327565b5060010190565b60208082526019908201527f5061757361626c653a20696e6465782069732070617573656400000000000000604082015260600190565b60008235605e198336030181126153a557600080fd5b9190910192915050565b6000808335601e198436030181126153c657600080fd5b8301803591506001600160401b038211156153e057600080fd5b6020019150600581901b360382131561452257600080fd5b6060810182356154078161488f565b6001600160a01b0390811683526020840135906154238261488f565b166020830152604083013561543781614cc1565b63ffffffff811660408401525092915050565b60208152816020820152818360408301376000818301604090810191909152601f909201601f19160101919050565b60006020828403121561548b57600080fd5b8151614a1c8161488f565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b60208082526037908201527f44656c65676174696f6e4d616e616765723a206f6e6c7953747261746567794d60408201527f616e616765724f72456967656e506f644d616e61676572000000000000000000606082015260800190565b60006020828403121561554f57600080fd5b8151614a1c81614eeb565b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b6000823560de198336030181126153a557600080fd5b6000602082840312156155ca57600080fd5b8135614a1c81614eeb565b600060018060a01b03808351168452806020840151166020850152806040840151166040850152506060820151606084015263ffffffff608083015116608084015260a082015160e060a085015261563060e085018261523f565b905060c083015184820360c08601526112208282615148565b602081526000614a1c60208301846155d5565b60006020828403121561566e57600080fd5b5051919050565b600082601f83011261568657600080fd5b81516020615696614d2283614cde565b82815260059290921b840181019181810190868411156156b557600080fd5b8286015b84811015614d6a57805183529183019183016156b9565b600080604083850312156156e357600080fd5b82516001600160401b03808211156156fa57600080fd5b818501915085601f83011261570e57600080fd5b8151602061571e614d2283614cde565b82815260059290921b8401810191818101908984111561573d57600080fd5b948201945b838610156157645785516157558161488f565b82529482019490820190615742565b9188015191965090935050508082111561577d57600080fd5b5061513e85828601615675565b6000821982111561579d5761579d615327565b500190565b6000828210156157b4576157b4615327565b500390565b6001600160a01b039384168152919092166020820152604081019190915260600190565b828152604060208201526000614ec060408301846155d5565b60006020828403121561580857600080fd5b8135614a1c81614cc1565b80546001600160a01b0319166001600160a01b0392909216919091179055565b813561583e8161488f565b6158488183615813565b5060018101602083013561585b8161488f565b6158658183615813565b50604083013561587481614cc1565b815463ffffffff60a01b191660a09190911b63ffffffff60a01b161790555050565b60006117513683614dd0565b6020808252606e908201526000805160206159c883398151915260408201527f645769746864726177616c3a207769746864726177616c44656c6179426c6f6360608201527f6b7320706572696f6420686173206e6f74207965742070617373656420666f7260808201526d207468697320737472617465677960901b60a082015260c00190565b82815260006020604081840152835180604085015260005b8181101561595e57858101830151858201606001528201615942565b81811115615970576000606083870101525b50601f01601f191692909201606001949350505050565b60006020828403121561599957600080fd5b81516001600160e01b031981168114614a1c57600080fd5b634e487b7160e01b600052602160045260246000fdfe44656c65676174696f6e4d616e616765722e5f636f6d706c6574655175657565a264697066735822122046f59d0774fea296e76e107662bfe5a0f076e0013aabe21beb6ded4a9b0f61a864736f6c634300080c0033", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_strategyManager\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"},{\"name\":\"_slasher\",\"type\":\"address\",\"internalType\":\"contractISlasher\"},{\"name\":\"_eigenPodManager\",\"type\":\"address\",\"internalType\":\"contractIEigenPodManager\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"DELEGATION_APPROVAL_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"DOMAIN_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_STAKER_OPT_OUT_WINDOW_BLOCKS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_WITHDRAWAL_DELAY_BLOCKS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"STAKER_DELEGATION_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\":\"calculateCurrentStakerDelegationDigestHash\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"calculateStakerDelegationDigestHash\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_stakerNonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateWithdrawalRoot\",\"inputs\":[{\"name\":\"withdrawal\",\"type\":\"tuple\",\"internalType\":\"structIDelegationManager.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\":\"shares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"completeQueuedWithdrawal\",\"inputs\":[{\"name\":\"withdrawal\",\"type\":\"tuple\",\"internalType\":\"structIDelegationManager.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\":\"shares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]},{\"name\":\"tokens\",\"type\":\"address[]\",\"internalType\":\"contractIERC20[]\"},{\"name\":\"middlewareTimesIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"receiveAsTokens\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeQueuedWithdrawals\",\"inputs\":[{\"name\":\"withdrawals\",\"type\":\"tuple[]\",\"internalType\":\"structIDelegationManager.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\":\"shares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]},{\"name\":\"tokens\",\"type\":\"address[][]\",\"internalType\":\"contractIERC20[][]\"},{\"name\":\"middlewareTimesIndexes\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"receiveAsTokens\",\"type\":\"bool[]\",\"internalType\":\"bool[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"cumulativeWithdrawalsQueued\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"decreaseDelegatedShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegateTo\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"approverSignatureAndExpiry\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtils.SignatureWithExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"approverSalt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegateToBySignature\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"stakerSignatureAndExpiry\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtils.SignatureWithExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"approverSignatureAndExpiry\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtils.SignatureWithExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"approverSalt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegatedTo\",\"inputs\":[{\"name\":\"\",\"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\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"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\":\"getDelegatableShares\",\"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\":\"getWithdrawalDelay\",\"inputs\":[{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"increaseDelegatedShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"initialPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_minWithdrawalDelayBlocks\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"_withdrawalDelayBlocks\",\"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\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"modifyOperatorDetails\",\"inputs\":[{\"name\":\"newOperatorDetails\",\"type\":\"tuple\",\"internalType\":\"structIDelegationManager.OperatorDetails\",\"components\":[{\"name\":\"__deprecated_earningsReceiver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegationApprover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"stakerOptOutWindowBlocks\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"operatorDetails\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIDelegationManager.OperatorDetails\",\"components\":[{\"name\":\"__deprecated_earningsReceiver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegationApprover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"stakerOptOutWindowBlocks\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"operatorShares\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pendingWithdrawals\",\"inputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"queueWithdrawals\",\"inputs\":[{\"name\":\"queuedWithdrawalParams\",\"type\":\"tuple[]\",\"internalType\":\"structIDelegationManager.QueuedWithdrawalParams[]\",\"components\":[{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"shares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registerAsOperator\",\"inputs\":[{\"name\":\"registeringOperatorDetails\",\"type\":\"tuple\",\"internalType\":\"structIDelegationManager.OperatorDetails\",\"components\":[{\"name\":\"__deprecated_earningsReceiver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegationApprover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"stakerOptOutWindowBlocks\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"metadataURI\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setMinWithdrawalDelayBlocks\",\"inputs\":[{\"name\":\"newMinWithdrawalDelayBlocks\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setPauserRegistry\",\"inputs\":[{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setStrategyWithdrawalDelayBlocks\",\"inputs\":[{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"withdrawalDelayBlocks\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"slasher\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractISlasher\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"stakerNonce\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"stakerOptOutWindowBlocks\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"strategyManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"strategyWithdrawalDelayBlocks\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"undelegate\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"withdrawalRoots\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateOperatorMetadataURI\",\"inputs\":[{\"name\":\"metadataURI\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"MinWithdrawalDelayBlocksSet\",\"inputs\":[{\"name\":\"previousValue\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"newValue\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorDetailsModified\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOperatorDetails\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIDelegationManager.OperatorDetails\",\"components\":[{\"name\":\"__deprecated_earningsReceiver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegationApprover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"stakerOptOutWindowBlocks\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"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\":\"operatorDetails\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIDelegationManager.OperatorDetails\",\"components\":[{\"name\":\"__deprecated_earningsReceiver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegationApprover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"stakerOptOutWindowBlocks\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSharesDecreased\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"staker\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSharesIncreased\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"staker\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PauserRegistrySet\",\"inputs\":[{\"name\":\"pauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"}],\"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\":\"StrategyWithdrawalDelayBlocksSet\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"previousValue\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"newValue\",\"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\":\"event\",\"name\":\"WithdrawalCompleted\",\"inputs\":[{\"name\":\"withdrawalRoot\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"WithdrawalQueued\",\"inputs\":[{\"name\":\"withdrawalRoot\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"withdrawal\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIDelegationManager.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\":\"shares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AlreadyDelegated\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CurrentlyPaused\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputArrayLengthMismatch\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputArrayLengthZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNewPausedStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidSignatureEIP1271\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidSignatureEOA\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotCurrentlyDelegated\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyPauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnpauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OperatorDoesNotExist\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OperatorsCannotUndelegate\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SignatureExpired\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SignatureSaltSpent\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StakerOptOutWindowBlocksCannotDecrease\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StakerOptOutWindowBlocksExceedsMax\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UnauthorizedCaller\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"WithdrawalDelayExceedsMax\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"WithdrawalDelayNotElapsed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"WithdrawalDoesNotExist\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"WithdrawerNotStaker\",\"inputs\":[]}]", + Bin: "0x61010060405234801561001157600080fd5b50604051614ca9380380614ca983398101604081905261003091610135565b6001600160a01b0380841660805280821660c052821660a05261005161005d565b50504660e05250610182565b600054610100900460ff16156100c95760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101561011b576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b038116811461013257600080fd5b50565b60008060006060848603121561014a57600080fd5b83516101558161011d565b60208501519093506101668161011d565b60408501519092506101778161011d565b809150509250925092565b60805160a05160c05160e051614a9361021660003960006120e50152600081816105b101528181610f0401528181611232015281816118fa01528181612312015281816131a401526135ba015260006107620152600081816104f901528181610ed2015281816112000152818161198e015281816123df015281816124b3015281816132ca01526136600152614a936000f3fe608060405234801561001057600080fd5b50600436106103425760003560e01c8063635bbd10116101b8578063b7f06ebe11610104578063cf80873e116100a2578063f16172b01161007c578063f16172b014610908578063f2fde38b1461091b578063f698da251461092e578063fabc1cbc1461093657600080fd5b8063cf80873e146108c1578063da8be864146108e2578063eea9064b146108f557600080fd5b8063c488375a116100de578063c488375a146107de578063c5e480db146107fe578063c94b5111146108a4578063ca661c04146108b757600080fd5b8063b7f06ebe14610784578063bb45fef2146107a7578063c448feb8146107d557600080fd5b8063886f1195116101715780639104c3191161014b5780639104c3191461070f57806399be81c81461072a578063a17884841461073d578063b13442711461075d57600080fd5b8063886f1195146106cb5780638da5cb5b146106de57806390041347146106ef57600080fd5b8063635bbd101461063657806365da1264146106495780636d70f7ae14610672578063715018a614610685578063778e55f31461068d5780637f548071146106b857600080fd5b806328a573ae116102925780634665bcda11610230578063597b36da1161020a578063597b36da146105e55780635ac86ab7146105f85780635c975abb1461061b57806360d7faed1461062357600080fd5b80634665bcda146105ac5780634fc40b61146105d3578063595c6a67146105dd57600080fd5b806339b70e381161026c57806339b70e38146104f45780633cdeb5e0146105335780633e28391d14610562578063433773821461058557600080fd5b806328a573ae146104ae57806329c77d4f146104c157806333404396146104e157600080fd5b8063132d4967116102ff57806316928365116102d957806316928365146104285780631bbce0911461046157806320606b701461047457806322bf40e41461049b57600080fd5b8063132d4967146103ef578063136439dd146104025780631522bf021461041557600080fd5b80630449ca391461034757806304a4f9791461036d5780630b9f487a146103945780630dd8dd02146103a75780630f589e59146103c757806310d67a2f146103dc575b600080fd5b61035a610355366004613a69565b610949565b6040519081526020015b60405180910390f35b61035a7f14bde674c9f64b2ad00eaaee4a8bed1fabef35c7507e3c5b9cfc9436909a2dad81565b61035a6103a2366004613acf565b6109c8565b6103ba6103b5366004613a69565b610a8a565b6040516103649190613b2a565b6103da6103d5366004613bbb565b610d36565b005b6103da6103ea366004613c0e565b610e13565b6103da6103fd366004613c32565b610ec7565b6103da610410366004613c73565b610f7f565b6103da610423366004613c8c565b61106a565b61035a610436366004613c0e565b6001600160a01b0316600090815260996020526040902060010154600160a01b900463ffffffff1690565b61035a61046f366004613c32565b61107e565b61035a7f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b6103da6104a9366004613cfb565b6110ac565b6103da6104bc366004613c32565b6111f5565b61035a6104cf366004613c0e565b609b6020526000908152604090205481565b6103da6104ef366004613da6565b6112a6565b61051b7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610364565b61051b610541366004613c0e565b6001600160a01b039081166000908152609960205260409020600101541690565b610575610570366004613c0e565b6113da565b6040519015158152602001610364565b61035a7f39111bc4a4d688e1f685123d7497d4615370152a8ee4a0593e647bd06ad8bb0b81565b61051b7f000000000000000000000000000000000000000000000000000000000000000081565b61035a6213c68081565b6103da6113fa565b61035a6105f33660046140bd565b6114c2565b6105756106063660046140f9565b606654600160ff9092169190911b9081161490565b60665461035a565b6103da61063136600461412a565b6114f2565b6103da610644366004613c73565b61158c565b61051b610657366004613c0e565b609a602052600090815260409020546001600160a01b031681565b610575610680366004613c0e565b61159d565b6103da6115d4565b61035a61069b3660046141ba565b609860209081526000928352604080842090915290825290205481565b6103da6106c636600461429e565b6115e8565b60655461051b906001600160a01b031681565b6033546001600160a01b031661051b565b6107026106fd366004614332565b6116db565b60405161036491906143bd565b61051b73beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac081565b6103da6107383660046143d0565b6117ad565b61035a61074b366004613c0e565b609f6020526000908152604090205481565b61051b7f000000000000000000000000000000000000000000000000000000000000000081565b610575610792366004613c73565b609e6020526000908152604090205460ff1681565b6105756107b5366004614405565b609c60209081526000928352604080842090915290825290205460ff1681565b61035a609d5481565b61035a6107ec366004613c0e565b60a16020526000908152604090205481565b61086e61080c366004613c0e565b6040805160608082018352600080835260208084018290529284018190526001600160a01b03948516815260998352839020835191820184528054851682526001015493841691810191909152600160a01b90920463ffffffff169082015290565b6040805182516001600160a01b039081168252602080850151909116908201529181015163ffffffff1690820152606001610364565b61035a6108b2366004614431565b61181a565b61035a62034bc081565b6108d46108cf366004613c0e565b6118d3565b6040516103649291906144b4565b6103ba6108f0366004613c0e565b611c8a565b6103da6109033660046144d9565b611fe2565b6103da610916366004614532565b61203b565b6103da610929366004613c0e565b61206b565b61035a6120e1565b6103da610944366004613c73565b61211e565b609d54600090815b838110156109be57600060a160008787858181106109715761097161454e565b90506020020160208101906109869190613c0e565b6001600160a01b03166001600160a01b03168152602001908152602001600020549050828111156109b5578092505b50600101610951565b5090505b92915050565b604080517f14bde674c9f64b2ad00eaaee4a8bed1fabef35c7507e3c5b9cfc9436909a2dad6020808301919091526001600160a01b038681168385015288811660608401528716608083015260a0820185905260c08083018590528351808403909101815260e0909201909252805191012060009081610a466120e1565b60405161190160f01b602082015260228101919091526042810183905260620160408051808303601f19018152919052805160209091012098975050505050505050565b606654606090600190600290811603610ab65760405163840a48d560e01b815260040160405180910390fd5b6000836001600160401b03811115610ad057610ad0613e59565b604051908082528060200260200182016040528015610af9578160200160208202803683370190505b50336000908152609a60205260408120549192506001600160a01b03909116905b85811015610d2b57868682818110610b3457610b3461454e565b9050602002810190610b469190614564565b610b54906020810190614584565b9050878783818110610b6857610b6861454e565b9050602002810190610b7a9190614564565b610b849080614584565b905014610ba4576040516343714afd60e01b815260040160405180910390fd5b33878783818110610bb757610bb761454e565b9050602002810190610bc99190614564565b610bda906060810190604001613c0e565b6001600160a01b031614610c01576040516330c4716960e21b815260040160405180910390fd5b610d063383898985818110610c1857610c1861454e565b9050602002810190610c2a9190614564565b610c3b906060810190604001613c0e565b8a8a86818110610c4d57610c4d61454e565b9050602002810190610c5f9190614564565b610c699080614584565b808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508e92508d9150889050818110610caf57610caf61454e565b9050602002810190610cc19190614564565b610ccf906020810190614584565b8080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061222692505050565b838281518110610d1857610d1861454e565b6020908102919091010152600101610b1a565b509095945050505050565b610d3f336113da565b15610d5d57604051631a30c08d60e31b815260040160405180910390fd5b610d673384612660565b604080518082019091526060815260006020820152610d893380836000612752565b336001600160a01b03167f8e8485583a2310d41f7c82b9427d0bd49bad74bb9cff9d3402a29d8f9b28a0e285604051610dc291906145cd565b60405180910390a2336001600160a01b03167f02a919ed0e2acad1dd90f17ef2fa4ae5462ee1339170034a8531cca4b67080908484604051610e05929190614624565b60405180910390a250505050565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e66573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e8a9190614653565b6001600160a01b0316336001600160a01b031614610ebb5760405163794821ff60e01b815260040160405180910390fd5b610ec48161293e565b50565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480610f265750336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016145b610f4357604051635c427cd960e01b815260040160405180910390fd5b610f4c836113da565b15610f7a576001600160a01b038084166000908152609a602052604090205416610f78818585856129ce565b505b505050565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015610fc7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610feb9190614670565b61100857604051631d77d47760e21b815260040160405180910390fd5b6066548181161461102c5760405163c61dca5d60e01b815260040160405180910390fd5b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b611072612a49565b610f7884848484612aa3565b6001600160a01b0383166000908152609b60205260408120546110a38582868661181a565b95945050505050565b600054610100900460ff16158080156110cc5750600054600160ff909116105b806110e65750303b1580156110e6575060005460ff166001145b61114e5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff191660011790558015611171576000805461ff0019166101001790555b61117b8888612bc4565b611183612c49565b60975561118f89612ce0565b61119886612d32565b6111a485858585612aa3565b80156111ea576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806112545750336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016145b61127157604051635c427cd960e01b815260040160405180910390fd5b61127a836113da565b15610f7a576001600160a01b038084166000908152609a602052604090205416610f7881858585612d97565b6066546002906004908116036112cf5760405163840a48d560e01b815260040160405180910390fd5b600260c954036113215760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401611145565b600260c95560005b888110156113c9576113c18a8a838181106113465761134661454e565b9050602002810190611358919061468d565b89898481811061136a5761136a61454e565b905060200281019061137c9190614584565b89898681811061138e5761138e61454e565b905060200201358888878181106113a7576113a761454e565b90506020020160208101906113bc91906146a3565b612e12565b600101611329565b5050600160c9555050505050505050565b6001600160a01b039081166000908152609a602052604090205416151590565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015611442573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114669190614670565b61148357604051631d77d47760e21b815260040160405180910390fd5b600019606681905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b6000816040516020016114d5919061473f565b604051602081830303815290604052805190602001209050919050565b60665460029060049081160361151b5760405163840a48d560e01b815260040160405180910390fd5b600260c9540361156d5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401611145565b600260c95561157f8686868686612e12565b5050600160c95550505050565b611594612a49565b610ec481612d32565b60006001600160a01b038216158015906109c25750506001600160a01b039081166000818152609a60205260409020549091161490565b6115dc612a49565b6115e66000612ce0565b565b428360200151101561160d57604051630819bdcd60e01b815260040160405180910390fd5b611616856113da565b1561163457604051631a30c08d60e31b815260040160405180910390fd5b61163d8461159d565b61165a576040516325878fa360e21b815260040160405180910390fd5b6000609b6000876001600160a01b03166001600160a01b031681526020019081526020016000205490506000611696878388886020015161181a565b6001600160a01b0388166000908152609b6020526040902060018401905585519091506116c6908890839061349b565b6116d287878686612752565b50505050505050565b6060600082516001600160401b038111156116f8576116f8613e59565b604051908082528060200260200182016040528015611721578160200160208202803683370190505b50905060005b83518110156109be576001600160a01b0385166000908152609860205260408120855190919086908490811061175f5761175f61454e565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000205482828151811061179a5761179a61454e565b6020908102919091010152600101611727565b6117b63361159d565b6117d3576040516325878fa360e21b815260040160405180910390fd5b336001600160a01b03167f02a919ed0e2acad1dd90f17ef2fa4ae5462ee1339170034a8531cca4b6708090838360405161180e929190614624565b60405180910390a25050565b604080517f39111bc4a4d688e1f685123d7497d4615370152a8ee4a0593e647bd06ad8bb0b6020808301919091526001600160a01b0387811683850152851660608301526080820186905260a08083018590528351808403909101815260c09092019092528051910120600090816118906120e1565b60405161190160f01b602082015260228101919091526042810183905260620160408051808303601f190181529190528051602090910120979650505050505050565b6040516360f4062b60e01b81526001600160a01b03828116600483015260609182916000917f0000000000000000000000000000000000000000000000000000000000000000909116906360f4062b90602401602060405180830381865afa158015611943573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119679190614752565b6040516394f649dd60e01b81526001600160a01b03868116600483015291925060009182917f0000000000000000000000000000000000000000000000000000000000000000909116906394f649dd90602401600060405180830381865afa1580156119d7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526119ff91908101906147c9565b9150915060008313611a1657909590945092505050565b6060808351600003611acf576040805160018082528183019092529060208083019080368337505060408051600180825281830190925292945090506020808301908036833701905050905073beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac082600081518110611a8a57611a8a61454e565b60200260200101906001600160a01b031690816001600160a01b0316815250508481600081518110611abe57611abe61454e565b602002602001018181525050611c7d565b8351611adc9060016148a0565b6001600160401b03811115611af357611af3613e59565b604051908082528060200260200182016040528015611b1c578160200160208202803683370190505b50915081516001600160401b03811115611b3857611b38613e59565b604051908082528060200260200182016040528015611b61578160200160208202803683370190505b50905060005b8451811015611bfb57848181518110611b8257611b8261454e565b6020026020010151838281518110611b9c57611b9c61454e565b60200260200101906001600160a01b031690816001600160a01b031681525050838181518110611bce57611bce61454e565b6020026020010151828281518110611be857611be861454e565b6020908102919091010152600101611b67565b5073beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac08260018451611c2091906148b3565b81518110611c3057611c3061454e565b60200260200101906001600160a01b031690816001600160a01b031681525050848160018451611c6091906148b3565b81518110611c7057611c7061454e565b6020026020010181815250505b9097909650945050505050565b606654606090600190600290811603611cb65760405163840a48d560e01b815260040160405180910390fd5b611cbf836113da565b611cdc57604051630b3d63f960e11b815260040160405180910390fd5b611ce58361159d565b15611d03576040516311ca333560e31b815260040160405180910390fd5b6001600160a01b038316611d2a576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b038084166000818152609a602052604090205490911690331480611d5d5750336001600160a01b038216145b80611d8457506001600160a01b038181166000908152609960205260409020600101541633145b611da157604051635c427cd960e01b815260040160405180910390fd5b600080611dad866118d3565b9092509050336001600160a01b03871614611e0357826001600160a01b0316866001600160a01b03167ff0eddf07e6ea14f388b47e1e94a0f464ecbd9eed4171130e0fc0e99fb4030a8a60405160405180910390a35b826001600160a01b0316866001600160a01b03167ffee30966a256b71e14bc0ebfc94315e28ef4a97a7131a9e2b7a310a73af4467660405160405180910390a36001600160a01b0386166000908152609a6020526040812080546001600160a01b031916905582519003611e87576040805160008152602081019091529450611fd9565b81516001600160401b03811115611ea057611ea0613e59565b604051908082528060200260200182016040528015611ec9578160200160208202803683370190505b50945060005b8251811015611fd757604080516001808252818301909252600091602080830190803683375050604080516001808252818301909252929350600092915060208083019080368337019050509050848381518110611f2f57611f2f61454e565b602002602001015182600081518110611f4a57611f4a61454e565b60200260200101906001600160a01b031690816001600160a01b031681525050838381518110611f7c57611f7c61454e565b602002602001015181600081518110611f9757611f9761454e565b602002602001018181525050611fb089878b8585612226565b888481518110611fc257611fc261454e565b60209081029190910101525050600101611ecf565b505b50505050919050565b611feb336113da565b1561200957604051631a30c08d60e31b815260040160405180910390fd5b6120128361159d565b61202f576040516325878fa360e21b815260040160405180910390fd5b610f7a33848484612752565b6120443361159d565b612061576040516325878fa360e21b815260040160405180910390fd5b610ec43382612660565b612073612a49565b6001600160a01b0381166120d85760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401611145565b610ec481612ce0565b60007f00000000000000000000000000000000000000000000000000000000000000004603612111575060975490565b612119612c49565b905090565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612171573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121959190614653565b6001600160a01b0316336001600160a01b0316146121c65760405163794821ff60e01b815260040160405180910390fd5b6066541981196066541916146121ef5760405163c61dca5d60e01b815260040160405180910390fd5b606681905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200161105f565b60006001600160a01b03861661224f576040516339b190bb60e11b815260040160405180910390fd5b82516000036122715760405163796cc52560e01b815260040160405180910390fd5b60005b835181101561256e576001600160a01b038616156122ca576122ca86888684815181106122a3576122a361454e565b60200260200101518685815181106122bd576122bd61454e565b60200260200101516129ce565b73beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac06001600160a01b03168482815181106122fa576122fa61454e565b60200260200101516001600160a01b0316036123c2577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663beffbb89888584815181106123525761235261454e565b60200260200101516040518363ffffffff1660e01b815260040161238b9291906001600160a01b03929092168252602082015260400190565b600060405180830381600087803b1580156123a557600080fd5b505af11580156123b9573d6000803e3d6000fd5b50505050612566565b846001600160a01b0316876001600160a01b0316148061249457507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316639b4da03d85838151811061241e5761241e61454e565b60200260200101516040518263ffffffff1660e01b815260040161245191906001600160a01b0391909116815260200190565b602060405180830381865afa15801561246e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124929190614670565b155b6124b1576040516330c4716960e21b815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316638c80d4e5888684815181106124f3576124f361454e565b602002602001015186858151811061250d5761250d61454e565b60200260200101516040518463ffffffff1660e01b8152600401612533939291906148c6565b600060405180830381600087803b15801561254d57600080fd5b505af1158015612561573d6000803e3d6000fd5b505050505b600101612274565b506001600160a01b0386166000908152609f60205260408120805491829190612596836148ea565b919050555060006040518060e00160405280896001600160a01b03168152602001886001600160a01b03168152602001876001600160a01b031681526020018381526020014363ffffffff16815260200186815260200185815250905060006125fe826114c2565b6000818152609e602052604090819020805460ff19166001179055519091507f9009ab153e8014fbfb02f2217f5cde7aa7f9ad734ae85ca3ee3f4ca2fdd499f99061264c9083908590614903565b60405180910390a198975050505050505050565b6213c680612674606083016040840161491c565b63ffffffff16111561269957604051638b11ba2f60e01b815260040160405180910390fd5b6001600160a01b0382166000908152609960205260409081902060010154600160a01b900463ffffffff16906126d5906060840190840161491c565b63ffffffff1610156126fa5760405163102b92a760e01b815260040160405180910390fd5b6001600160a01b0382166000908152609960205260409020819061271e8282614959565b505060405133907ffebe5cd24b2cbc7b065b9d0fdeb904461e4afcff57dd57acda1e7832031ba7ac9061180e9084906145cd565b60665460009060019081160361277b5760405163840a48d560e01b815260040160405180910390fd5b6001600160a01b038085166000908152609960205260409020600101541680158015906127b15750336001600160a01b03821614155b80156127c65750336001600160a01b03861614155b156128895742846020015110156127f057604051630819bdcd60e01b815260040160405180910390fd5b6001600160a01b0381166000908152609c6020908152604080832086845290915290205460ff161561283557604051639a5afeb760e01b815260040160405180910390fd5b6001600160a01b0381166000908152609c6020908152604080832086845282528220805460ff191660011790558501516128769088908890859088906109c8565b90506128878282876000015161349b565b505b6001600160a01b038681166000818152609a602052604080822080546001600160a01b031916948a169485179055517fc3ee9f2e5fda98e8066a1f745b2df9285f416fe98cf2559cd21484b3d87433049190a36000806128e8886118d3565b9150915060005b82518110156111ea57612936888a85848151811061290f5761290f61454e565b60200260200101518585815181106129295761292961454e565b6020026020010151612d97565b6001016128ef565b6001600160a01b038116612965576040516339b190bb60e11b815260040160405180910390fd5b606554604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1606580546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03808516600090815260986020908152604080832093861683529290529081208054839290612a059084906148b3565b92505081905550836001600160a01b03167f6909600037b75d7b4733aedd815442b5ec018a827751c832aaff64eba5d6d2dd848484604051610e05939291906148c6565b6033546001600160a01b031633146115e65760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401611145565b828114612ac3576040516343714afd60e01b815260040160405180910390fd5b8260005b81811015612bbc576000868683818110612ae357612ae361454e565b9050602002016020810190612af89190613c0e565b6001600160a01b038116600090815260a16020526040812054919250868685818110612b2657612b2661454e565b90506020020135905062034bc0811115612b5357604051639373e7cf60e01b815260040160405180910390fd5b6001600160a01b038316600081815260a160209081526040918290208490558151928352820184905281018290527f0e7efa738e8b0ce6376a0c1af471655540d2e9a81647d7b09ed823018426576d9060600160405180910390a1505050806001019050612ac7565b505050505050565b6065546001600160a01b0316158015612be557506001600160a01b03821615155b612c02576040516339b190bb60e11b815260040160405180910390fd5b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2612c458261293e565b5050565b604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b62034bc0811115612d5657604051639373e7cf60e01b815260040160405180910390fd5b609d5460408051918252602082018390527fafa003cd76f87ff9d62b35beea889920f33c0c42b8d45b74954d61d50f4b6b69910160405180910390a1609d55565b6001600160a01b03808516600090815260986020908152604080832093861683529290529081208054839290612dce9084906148a0565b92505081905550836001600160a01b03167f1ec042c965e2edd7107b51188ee0f383e22e76179041ab3a9d18ff151405166c848484604051610e05939291906148c6565b6000612e206105f3876149bc565b6000818152609e602052604090205490915060ff16612e525760405163295a66e160e11b815260040160405180910390fd5b609d544390612e6760a0890160808a0161491c565b63ffffffff16612e7791906148a0565b1115612e96576040516378f67ae160e11b815260040160405180910390fd5b612ea66060870160408801613c0e565b6001600160a01b0316336001600160a01b031614612ed757604051635c427cd960e01b815260040160405180910390fd5b8115612f0b57612eea60a0870187614584565b85149050612f0b576040516343714afd60e01b815260040160405180910390fd5b6000818152609e60205260409020805460ff1916905581156130715760005b612f3760a0880188614584565b905081101561306b574360a16000612f5260a08b018b614584565b85818110612f6257612f6261454e565b9050602002016020810190612f779190613c0e565b6001600160a01b03168152602081019190915260400160002054612fa160a08a0160808b0161491c565b63ffffffff16612fb191906148a0565b1115612fd0576040516378f67ae160e11b815260040160405180910390fd5b613063612fe06020890189613c0e565b33612fee60a08b018b614584565b85818110612ffe57612ffe61454e565b90506020020160208101906130139190613c0e565b61302060c08c018c614584565b868181106130305761303061454e565b905060200201358a8a878181106130495761304961454e565b905060200201602081019061305e9190613c0e565b61357f565b600101612f2a565b50613460565b336000908152609a60205260408120546001600160a01b0316905b61309960a0890189614584565b905081101561345d574360a160006130b460a08c018c614584565b858181106130c4576130c461454e565b90506020020160208101906130d99190613c0e565b6001600160a01b0316815260208101919091526040016000205461310360a08b0160808c0161491c565b63ffffffff1661311391906148a0565b1115613132576040516378f67ae160e11b815260040160405180910390fd5b73beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac061315460a08a018a614584565b838181106131645761316461454e565b90506020020160208101906131799190613c0e565b6001600160a01b0316036132c857600061319660208a018a613c0e565b905060006001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016630e81073c836131d760c08e018e614584565b878181106131e7576131e761454e565b6040516001600160e01b031960e087901b1681526001600160a01b03909416600485015260200291909101356024830152506044016020604051808303816000875af115801561323b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061325f9190614752565b6001600160a01b038084166000908152609a60205260409020549192501680156132c0576132c0818461329560a08f018f614584565b888181106132a5576132a561454e565b90506020020160208101906132ba9190613c0e565b85612d97565b505050613455565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663c4623ea13389898581811061330a5761330a61454e565b905060200201602081019061331f9190613c0e565b61332c60a08d018d614584565b8681811061333c5761333c61454e565b90506020020160208101906133519190613c0e565b61335e60c08e018e614584565b8781811061336e5761336e61454e565b60405160e088901b6001600160e01b03191681526001600160a01b03968716600482015294861660248601529290941660448401526020909102013560648201526084019050600060405180830381600087803b1580156133ce57600080fd5b505af11580156133e2573d6000803e3d6000fd5b505050506001600160a01b0382161561345557613455823361340760a08c018c614584565b858181106134175761341761454e565b905060200201602081019061342c9190613c0e565b61343960c08d018d614584565b868181106134495761344961454e565b90506020020135612d97565b60010161308c565b50505b6040518181527fc97098c2f658800b4df29001527f7324bcdffcf6e8751a699ab920a1eced5b1d9060200160405180910390a1505050505050565b6001600160a01b0383163b1561354457604051630b135d3f60e11b808252906001600160a01b03851690631626ba7e906134db90869086906004016149c8565b602060405180830381865afa1580156134f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061351c9190614a1d565b6001600160e01b03191614610f7a5760405163026aa43360e31b815260040160405180910390fd5b826001600160a01b031661355883836136bf565b6001600160a01b031614610f7a576040516306c653c360e31b815260040160405180910390fd5b73beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeabf196001600160a01b0384160161362a5760405162387b1360e81b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063387b1300906135f3908890889087906004016148c6565b600060405180830381600087803b15801561360d57600080fd5b505af1158015613621573d6000803e3d6000fd5b505050506136b8565b60405163c608c7f360e01b81526001600160a01b03858116600483015284811660248301526044820184905282811660648301527f0000000000000000000000000000000000000000000000000000000000000000169063c608c7f390608401600060405180830381600087803b1580156136a457600080fd5b505af11580156111ea573d6000803e3d6000fd5b5050505050565b60008060006136ce85856136db565b915091506109be81613749565b60008082516041036137115760208301516040840151606085015160001a613705878285856138ff565b94509450505050613742565b825160400361373a576020830151604084015161372f8683836139ec565b935093505050613742565b506000905060025b9250929050565b600081600481111561375d5761375d614a47565b036137655750565b600181600481111561377957613779614a47565b036137c65760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401611145565b60028160048111156137da576137da614a47565b036138275760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401611145565b600381600481111561383b5761383b614a47565b036138935760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401611145565b60048160048111156138a7576138a7614a47565b03610ec45760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401611145565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561393657506000905060036139e3565b8460ff16601b1415801561394e57508460ff16601c14155b1561395f57506000905060046139e3565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156139b3573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166139dc576000600192509250506139e3565b9150600090505b94509492505050565b6000806001600160ff1b03831681613a0960ff86901c601b6148a0565b9050613a17878288856138ff565b935093505050935093915050565b60008083601f840112613a3757600080fd5b5081356001600160401b03811115613a4e57600080fd5b6020830191508360208260051b850101111561374257600080fd5b60008060208385031215613a7c57600080fd5b82356001600160401b03811115613a9257600080fd5b613a9e85828601613a25565b90969095509350505050565b6001600160a01b0381168114610ec457600080fd5b8035613aca81613aaa565b919050565b600080600080600060a08688031215613ae757600080fd5b8535613af281613aaa565b94506020860135613b0281613aaa565b93506040860135613b1281613aaa565b94979396509394606081013594506080013592915050565b602080825282518282018190526000918401906040840190835b81811015610d2b578351835260209384019390920191600101613b44565b600060608284031215613b7457600080fd5b50919050565b60008083601f840112613b8c57600080fd5b5081356001600160401b03811115613ba357600080fd5b60208301915083602082850101111561374257600080fd5b600080600060808486031215613bd057600080fd5b613bda8585613b62565b925060608401356001600160401b03811115613bf557600080fd5b613c0186828701613b7a565b9497909650939450505050565b600060208284031215613c2057600080fd5b8135613c2b81613aaa565b9392505050565b600080600060608486031215613c4757600080fd5b8335613c5281613aaa565b92506020840135613c6281613aaa565b929592945050506040919091013590565b600060208284031215613c8557600080fd5b5035919050565b60008060008060408587031215613ca257600080fd5b84356001600160401b03811115613cb857600080fd5b613cc487828801613a25565b90955093505060208501356001600160401b03811115613ce357600080fd5b613cef87828801613a25565b95989497509550505050565b60008060008060008060008060c0898b031215613d1757600080fd5b8835613d2281613aaa565b97506020890135613d3281613aaa565b9650604089013595506060890135945060808901356001600160401b03811115613d5b57600080fd5b613d678b828c01613a25565b90955093505060a08901356001600160401b03811115613d8657600080fd5b613d928b828c01613a25565b999c989b5096995094979396929594505050565b6000806000806000806000806080898b031215613dc257600080fd5b88356001600160401b03811115613dd857600080fd5b613de48b828c01613a25565b90995097505060208901356001600160401b03811115613e0357600080fd5b613e0f8b828c01613a25565b90975095505060408901356001600160401b03811115613e2e57600080fd5b613e3a8b828c01613a25565b90955093505060608901356001600160401b03811115613d8657600080fd5b634e487b7160e01b600052604160045260246000fd5b60405160e081016001600160401b0381118282101715613e9157613e91613e59565b60405290565b604080519081016001600160401b0381118282101715613e9157613e91613e59565b604051601f8201601f191681016001600160401b0381118282101715613ee157613ee1613e59565b604052919050565b63ffffffff81168114610ec457600080fd5b8035613aca81613ee9565b60006001600160401b03821115613f1f57613f1f613e59565b5060051b60200190565b600082601f830112613f3a57600080fd5b8135613f4d613f4882613f06565b613eb9565b8082825260208201915060208360051b860101925085831115613f6f57600080fd5b602085015b83811015613f95578035613f8781613aaa565b835260209283019201613f74565b5095945050505050565b600082601f830112613fb057600080fd5b8135613fbe613f4882613f06565b8082825260208201915060208360051b860101925085831115613fe057600080fd5b602085015b83811015613f95578035835260209283019201613fe5565b600060e0828403121561400f57600080fd5b614017613e6f565b905061402282613abf565b815261403060208301613abf565b602082015261404160408301613abf565b60408201526060828101359082015261405c60808301613efb565b608082015260a08201356001600160401b0381111561407a57600080fd5b61408684828501613f29565b60a08301525060c08201356001600160401b038111156140a557600080fd5b6140b184828501613f9f565b60c08301525092915050565b6000602082840312156140cf57600080fd5b81356001600160401b038111156140e557600080fd5b6140f184828501613ffd565b949350505050565b60006020828403121561410b57600080fd5b813560ff81168114613c2b57600080fd5b8015158114610ec457600080fd5b60008060008060006080868803121561414257600080fd5b85356001600160401b0381111561415857600080fd5b860160e0818903121561416a57600080fd5b945060208601356001600160401b0381111561418557600080fd5b61419188828901613a25565b9095509350506040860135915060608601356141ac8161411c565b809150509295509295909350565b600080604083850312156141cd57600080fd5b82356141d881613aaa565b915060208301356141e881613aaa565b809150509250929050565b60006040828403121561420557600080fd5b61420d613e97565b905081356001600160401b0381111561422557600080fd5b8201601f8101841361423657600080fd5b80356001600160401b0381111561424f5761424f613e59565b614262601f8201601f1916602001613eb9565b81815285602083850101111561427757600080fd5b81602084016020830137600060209282018301528352928301359282019290925292915050565b600080600080600060a086880312156142b657600080fd5b85356142c181613aaa565b945060208601356142d181613aaa565b935060408601356001600160401b038111156142ec57600080fd5b6142f8888289016141f3565b93505060608601356001600160401b0381111561431457600080fd5b614320888289016141f3565b95989497509295608001359392505050565b6000806040838503121561434557600080fd5b823561435081613aaa565b915060208301356001600160401b0381111561436b57600080fd5b61437785828601613f29565b9150509250929050565b600081518084526020840193506020830160005b828110156143b3578151865260209586019590910190600101614395565b5093949350505050565b602081526000613c2b6020830184614381565b600080602083850312156143e357600080fd5b82356001600160401b038111156143f957600080fd5b613a9e85828601613b7a565b6000806040838503121561441857600080fd5b823561442381613aaa565b946020939093013593505050565b6000806000806080858703121561444757600080fd5b843561445281613aaa565b935060208501359250604085013561446981613aaa565b9396929550929360600135925050565b600081518084526020840193506020830160005b828110156143b35781516001600160a01b031686526020958601959091019060010161448d565b6040815260006144c76040830185614479565b82810360208401526110a38185614381565b6000806000606084860312156144ee57600080fd5b83356144f981613aaa565b925060208401356001600160401b0381111561451457600080fd5b614520868287016141f3565b93969395505050506040919091013590565b60006060828403121561454457600080fd5b613c2b8383613b62565b634e487b7160e01b600052603260045260246000fd5b60008235605e1983360301811261457a57600080fd5b9190910192915050565b6000808335601e1984360301811261459b57600080fd5b8301803591506001600160401b038211156145b557600080fd5b6020019150600581901b360382131561374257600080fd5b6060810182356145dc81613aaa565b6001600160a01b0316825260208301356145f581613aaa565b6001600160a01b03166020830152604083013561461181613ee9565b63ffffffff811660408401525092915050565b60208152816020820152818360408301376000818301604090810191909152601f909201601f19160101919050565b60006020828403121561466557600080fd5b8151613c2b81613aaa565b60006020828403121561468257600080fd5b8151613c2b8161411c565b6000823560de1983360301811261457a57600080fd5b6000602082840312156146b557600080fd5b8135613c2b8161411c565b80516001600160a01b039081168352602080830151821690840152604080830151909116908301526060808201519083015260808082015160009161470c9085018263ffffffff169052565b5060a082015160e060a085015261472660e0850182614479565b905060c083015184820360c08601526110a38282614381565b602081526000613c2b60208301846146c0565b60006020828403121561476457600080fd5b5051919050565b600082601f83011261477c57600080fd5b815161478a613f4882613f06565b8082825260208201915060208360051b8601019250858311156147ac57600080fd5b602085015b83811015613f955780518352602092830192016147b1565b600080604083850312156147dc57600080fd5b82516001600160401b038111156147f257600080fd5b8301601f8101851361480357600080fd5b8051614811613f4882613f06565b8082825260208201915060208360051b85010192508783111561483357600080fd5b6020840193505b8284101561485e57835161484d81613aaa565b82526020938401939091019061483a565b8095505050505060208301516001600160401b0381111561487e57600080fd5b6143778582860161476b565b634e487b7160e01b600052601160045260246000fd5b808201808211156109c2576109c261488a565b818103818111156109c2576109c261488a565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6000600182016148fc576148fc61488a565b5060010190565b8281526040602082015260006140f160408301846146c0565b60006020828403121561492e57600080fd5b8135613c2b81613ee9565b80546001600160a01b0319166001600160a01b0392909216919091179055565b813561496481613aaa565b61496e8183614939565b5060018101602083013561498181613aaa565b61498b8183614939565b50604083013561499a81613ee9565b815463ffffffff60a01b191660a09190911b63ffffffff60a01b161790555050565b60006109c23683613ffd565b828152604060208201526000825180604084015260005b818110156149fc57602081860181015160608684010152016149df565b506000606082850101526060601f19601f8301168401019150509392505050565b600060208284031215614a2f57600080fd5b81516001600160e01b031981168114613c2b57600080fd5b634e487b7160e01b600052602160045260246000fdfea2646970667358221220196e24351b49d934a7545548d043d9b4aaaf25ae2fc57705df170153f75a12a864736f6c634300081b0033", } // DelegationManagerABI is the input ABI used to generate the binding from. diff --git a/pkg/bindings/DelegationManagerStorage/binding.go b/pkg/bindings/DelegationManagerStorage/binding.go index 3930e4310..4b84442e1 100644 --- a/pkg/bindings/DelegationManagerStorage/binding.go +++ b/pkg/bindings/DelegationManagerStorage/binding.go @@ -62,7 +62,7 @@ type ISignatureUtilsSignatureWithExpiry struct { // 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\":\"DOMAIN_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_WITHDRAWAL_DELAY_BLOCKS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"STAKER_DELEGATION_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\":\"calculateCurrentStakerDelegationDigestHash\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"calculateStakerDelegationDigestHash\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_stakerNonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateWithdrawalRoot\",\"inputs\":[{\"name\":\"withdrawal\",\"type\":\"tuple\",\"internalType\":\"structIDelegationManager.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\":\"shares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"completeQueuedWithdrawal\",\"inputs\":[{\"name\":\"withdrawal\",\"type\":\"tuple\",\"internalType\":\"structIDelegationManager.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\":\"shares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]},{\"name\":\"tokens\",\"type\":\"address[]\",\"internalType\":\"contractIERC20[]\"},{\"name\":\"middlewareTimesIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"receiveAsTokens\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeQueuedWithdrawals\",\"inputs\":[{\"name\":\"withdrawals\",\"type\":\"tuple[]\",\"internalType\":\"structIDelegationManager.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\":\"shares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]},{\"name\":\"tokens\",\"type\":\"address[][]\",\"internalType\":\"contractIERC20[][]\"},{\"name\":\"middlewareTimesIndexes\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"receiveAsTokens\",\"type\":\"bool[]\",\"internalType\":\"bool[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"cumulativeWithdrawalsQueued\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"decreaseDelegatedShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegateTo\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"approverSignatureAndExpiry\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtils.SignatureWithExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"approverSalt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegateToBySignature\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"stakerSignatureAndExpiry\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtils.SignatureWithExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"approverSignatureAndExpiry\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtils.SignatureWithExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"approverSalt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegatedTo\",\"inputs\":[{\"name\":\"\",\"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\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"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\":\"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\":\"getWithdrawalDelay\",\"inputs\":[{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"increaseDelegatedShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"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\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"modifyOperatorDetails\",\"inputs\":[{\"name\":\"newOperatorDetails\",\"type\":\"tuple\",\"internalType\":\"structIDelegationManager.OperatorDetails\",\"components\":[{\"name\":\"__deprecated_earningsReceiver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegationApprover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"stakerOptOutWindowBlocks\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"operatorDetails\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIDelegationManager.OperatorDetails\",\"components\":[{\"name\":\"__deprecated_earningsReceiver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegationApprover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"stakerOptOutWindowBlocks\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"operatorShares\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pendingWithdrawals\",\"inputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"queueWithdrawals\",\"inputs\":[{\"name\":\"queuedWithdrawalParams\",\"type\":\"tuple[]\",\"internalType\":\"structIDelegationManager.QueuedWithdrawalParams[]\",\"components\":[{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"shares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registerAsOperator\",\"inputs\":[{\"name\":\"registeringOperatorDetails\",\"type\":\"tuple\",\"internalType\":\"structIDelegationManager.OperatorDetails\",\"components\":[{\"name\":\"__deprecated_earningsReceiver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegationApprover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"stakerOptOutWindowBlocks\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"metadataURI\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"slasher\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractISlasher\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"stakerNonce\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"stakerOptOutWindowBlocks\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"strategyManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"strategyWithdrawalDelayBlocks\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"undelegate\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"withdrawalRoot\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateOperatorMetadataURI\",\"inputs\":[{\"name\":\"metadataURI\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"MinWithdrawalDelayBlocksSet\",\"inputs\":[{\"name\":\"previousValue\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"newValue\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorDetailsModified\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOperatorDetails\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIDelegationManager.OperatorDetails\",\"components\":[{\"name\":\"__deprecated_earningsReceiver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegationApprover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"stakerOptOutWindowBlocks\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"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\":\"operatorDetails\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIDelegationManager.OperatorDetails\",\"components\":[{\"name\":\"__deprecated_earningsReceiver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegationApprover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"stakerOptOutWindowBlocks\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"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\":\"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\":\"StrategyWithdrawalDelayBlocksSet\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"previousValue\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"newValue\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"WithdrawalCompleted\",\"inputs\":[{\"name\":\"withdrawalRoot\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"WithdrawalQueued\",\"inputs\":[{\"name\":\"withdrawalRoot\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"withdrawal\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIDelegationManager.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\":\"shares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]}],\"anonymous\":false}]", + ABI: "[{\"type\":\"function\",\"name\":\"DELEGATION_APPROVAL_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"DOMAIN_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_WITHDRAWAL_DELAY_BLOCKS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"STAKER_DELEGATION_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\":\"calculateCurrentStakerDelegationDigestHash\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"calculateStakerDelegationDigestHash\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_stakerNonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateWithdrawalRoot\",\"inputs\":[{\"name\":\"withdrawal\",\"type\":\"tuple\",\"internalType\":\"structIDelegationManager.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\":\"shares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"completeQueuedWithdrawal\",\"inputs\":[{\"name\":\"withdrawal\",\"type\":\"tuple\",\"internalType\":\"structIDelegationManager.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\":\"shares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]},{\"name\":\"tokens\",\"type\":\"address[]\",\"internalType\":\"contractIERC20[]\"},{\"name\":\"middlewareTimesIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"receiveAsTokens\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeQueuedWithdrawals\",\"inputs\":[{\"name\":\"withdrawals\",\"type\":\"tuple[]\",\"internalType\":\"structIDelegationManager.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\":\"shares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]},{\"name\":\"tokens\",\"type\":\"address[][]\",\"internalType\":\"contractIERC20[][]\"},{\"name\":\"middlewareTimesIndexes\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"receiveAsTokens\",\"type\":\"bool[]\",\"internalType\":\"bool[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"cumulativeWithdrawalsQueued\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"decreaseDelegatedShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegateTo\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"approverSignatureAndExpiry\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtils.SignatureWithExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"approverSalt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegateToBySignature\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"stakerSignatureAndExpiry\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtils.SignatureWithExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"approverSignatureAndExpiry\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtils.SignatureWithExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"approverSalt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegatedTo\",\"inputs\":[{\"name\":\"\",\"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\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"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\":\"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\":\"getWithdrawalDelay\",\"inputs\":[{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"increaseDelegatedShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"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\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"modifyOperatorDetails\",\"inputs\":[{\"name\":\"newOperatorDetails\",\"type\":\"tuple\",\"internalType\":\"structIDelegationManager.OperatorDetails\",\"components\":[{\"name\":\"__deprecated_earningsReceiver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegationApprover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"stakerOptOutWindowBlocks\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"operatorDetails\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIDelegationManager.OperatorDetails\",\"components\":[{\"name\":\"__deprecated_earningsReceiver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegationApprover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"stakerOptOutWindowBlocks\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"operatorShares\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pendingWithdrawals\",\"inputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"queueWithdrawals\",\"inputs\":[{\"name\":\"queuedWithdrawalParams\",\"type\":\"tuple[]\",\"internalType\":\"structIDelegationManager.QueuedWithdrawalParams[]\",\"components\":[{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"shares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registerAsOperator\",\"inputs\":[{\"name\":\"registeringOperatorDetails\",\"type\":\"tuple\",\"internalType\":\"structIDelegationManager.OperatorDetails\",\"components\":[{\"name\":\"__deprecated_earningsReceiver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegationApprover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"stakerOptOutWindowBlocks\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"metadataURI\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"slasher\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractISlasher\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"stakerNonce\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"stakerOptOutWindowBlocks\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"strategyManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"strategyWithdrawalDelayBlocks\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"undelegate\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"withdrawalRoot\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateOperatorMetadataURI\",\"inputs\":[{\"name\":\"metadataURI\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"MinWithdrawalDelayBlocksSet\",\"inputs\":[{\"name\":\"previousValue\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"newValue\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorDetailsModified\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOperatorDetails\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIDelegationManager.OperatorDetails\",\"components\":[{\"name\":\"__deprecated_earningsReceiver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegationApprover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"stakerOptOutWindowBlocks\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"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\":\"operatorDetails\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIDelegationManager.OperatorDetails\",\"components\":[{\"name\":\"__deprecated_earningsReceiver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegationApprover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"stakerOptOutWindowBlocks\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"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\":\"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\":\"StrategyWithdrawalDelayBlocksSet\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"previousValue\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"newValue\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"WithdrawalCompleted\",\"inputs\":[{\"name\":\"withdrawalRoot\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"WithdrawalQueued\",\"inputs\":[{\"name\":\"withdrawalRoot\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"withdrawal\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIDelegationManager.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\":\"shares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AlreadyDelegated\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputArrayLengthMismatch\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputArrayLengthZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotCurrentlyDelegated\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OperatorDoesNotExist\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OperatorsCannotUndelegate\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SignatureExpired\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SignatureSaltSpent\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StakerOptOutWindowBlocksCannotDecrease\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StakerOptOutWindowBlocksExceedsMax\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UnauthorizedCaller\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"WithdrawalDelayExceedsMax\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"WithdrawalDelayNotElapsed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"WithdrawalDoesNotExist\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"WithdrawerNotStaker\",\"inputs\":[]}]", } // DelegationManagerStorageABI is the input ABI used to generate the binding from. diff --git a/pkg/bindings/EIP1271SignatureUtils/binding.go b/pkg/bindings/EIP1271SignatureUtils/binding.go index d5903bc37..b854fe640 100644 --- a/pkg/bindings/EIP1271SignatureUtils/binding.go +++ b/pkg/bindings/EIP1271SignatureUtils/binding.go @@ -31,8 +31,8 @@ var ( // EIP1271SignatureUtilsMetaData contains all meta data concerning the EIP1271SignatureUtils contract. var EIP1271SignatureUtilsMetaData = &bind.MetaData{ - ABI: "[]", - Bin: "0x60566037600b82828239805160001a607314602a57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea26469706673582212209832fdd04d36d0bbe78b7b9457ca6759978d3e81a33602cb69f518c735ee384664736f6c634300080c0033", + ABI: "[{\"type\":\"error\",\"name\":\"InvalidSignatureEIP1271\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidSignatureEOA\",\"inputs\":[]}]", + Bin: "0x60566037600b82828239805160001a607314602a57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea2646970667358221220a27cdff4a9cf4e5da49114322ca7517a562e3d78193fe8b3dffb108e578d732664736f6c634300081b0033", } // EIP1271SignatureUtilsABI is the input ABI used to generate the binding from. diff --git a/pkg/bindings/Eigen/binding.go b/pkg/bindings/Eigen/binding.go index 419305571..b20c0ea5e 100644 --- a/pkg/bindings/Eigen/binding.go +++ b/pkg/bindings/Eigen/binding.go @@ -38,7 +38,7 @@ type ERC20VotesUpgradeableCheckpoint struct { // EigenMetaData contains all meta data concerning the Eigen contract. var EigenMetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_bEIGEN\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"CLOCK_MODE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"DOMAIN_SEPARATOR\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"allowance\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"allowedFrom\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"allowedTo\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"approve\",\"inputs\":[{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"bEIGEN\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"balanceOf\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"checkpoints\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"pos\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structERC20VotesUpgradeable.Checkpoint\",\"components\":[{\"name\":\"fromBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"votes\",\"type\":\"uint224\",\"internalType\":\"uint224\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"clock\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint48\",\"internalType\":\"uint48\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"decimals\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"decreaseAllowance\",\"inputs\":[{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"subtractedValue\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegate\",\"inputs\":[{\"name\":\"delegatee\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegateBySig\",\"inputs\":[{\"name\":\"delegatee\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"v\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"r\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"s\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegates\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"disableTransferRestrictions\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"eip712Domain\",\"inputs\":[],\"outputs\":[{\"name\":\"fields\",\"type\":\"bytes1\",\"internalType\":\"bytes1\"},{\"name\":\"name\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"version\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"chainId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"verifyingContract\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"extensions\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getPastTotalSupply\",\"inputs\":[{\"name\":\"timepoint\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getPastVotes\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"timepoint\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getVotes\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"increaseAllowance\",\"inputs\":[{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"addedValue\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"minters\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"mintingAllowances\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"mintAllowedAfters\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"mint\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"mintAllowedAfter\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"mintingAllowance\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"multisend\",\"inputs\":[{\"name\":\"receivers\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"amounts\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"name\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"nonces\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"numCheckpoints\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"permit\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"deadline\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"v\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"r\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"s\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setAllowedFrom\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"isAllowedFrom\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setAllowedTo\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"isAllowedTo\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"symbol\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"totalSupply\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transfer\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferFrom\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferRestrictionsDisabledAfter\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"unwrap\",\"inputs\":[{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"wrap\",\"inputs\":[{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"Approval\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"spender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegateChanged\",\"inputs\":[{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"fromDelegate\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"toDelegate\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegateVotesChanged\",\"inputs\":[{\"name\":\"delegate\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"previousBalance\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"newBalance\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"EIP712DomainChanged\",\"inputs\":[],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Mint\",\"inputs\":[{\"name\":\"minter\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"SetAllowedFrom\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"isAllowedFrom\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"SetAllowedTo\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"isAllowedTo\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Transfer\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TransferRestrictionsDisabled\",\"inputs\":[],\"anonymous\":false}]", - Bin: "0x60a06040523480156200001157600080fd5b506040516200342538038062003425833981016040819052620000349162000113565b6001600160a01b0381166080526200004b62000052565b5062000145565b600054610100900460ff1615620000bf5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff9081161462000111576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6000602082840312156200012657600080fd5b81516001600160a01b03811681146200013e57600080fd5b9392505050565b6080516132b66200016f6000396000818161034801528181611475015261156401526132b66000f3fe608060405234801561001057600080fd5b506004361061025e5760003560e01c806381b9716111610146578063a9059cbb116100c3578063dd62ed3e11610087578063dd62ed3e146105c5578063de0e9a3e146105d8578063ea598cb0146105eb578063eb415f45146105fe578063f1127ed814610606578063f2fde38b1461064357600080fd5b8063a9059cbb14610566578063aad41a4114610579578063b8c255941461058c578063c3cda5201461059f578063d505accf146105b257600080fd5b806395d89b411161010a57806395d89b411461051b5780639ab24eb0146105235780639aec4bae14610536578063a457c2d714610540578063a7d1195d1461055357600080fd5b806381b971611461049c57806384b0196e146104bd5780638da5cb5b146104d85780638e539e8c146104e957806391ddadf4146104fc57600080fd5b80633a46b1a8116101df5780635c19a95c116101a35780635c19a95c146103f95780636fcfff451461040c57806370a0823114610434578063715018a61461045d57806378aa33ba146104655780637ecebe001461048957600080fd5b80633a46b1a8146103305780633f4da4c6146103435780634bf5d7e91461038257806353957125146103ac578063587cde1e146103cd57600080fd5b80631ffacdef116102265780631ffacdef146102e057806323b872dd146102f3578063313ce567146103065780633644e51514610315578063395093511461031d57600080fd5b80630455e6941461026357806306fdde031461029c578063095ea7b3146102b15780631249c58b146102c457806318160ddd146102ce575b600080fd5b610287610271366004612b8a565b6101336020526000908152604090205460ff1681565b60405190151581526020015b60405180910390f35b6102a4610656565b6040516102939190612bf2565b6102876102bf366004612c05565b6106e8565b6102cc610700565b005b6067545b604051908152602001610293565b6102cc6102ee366004612c3d565b61084b565b610287610301366004612c74565b6108b4565b60405160128152602001610293565b6102d26108d8565b61028761032b366004612c05565b6108e7565b6102d261033e366004612c05565b610909565b61036a7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610293565b60408051808201909152600e81526d06d6f64653d74696d657374616d760941b60208201526102a4565b6102d26103ba366004612b8a565b6101306020526000908152604090205481565b61036a6103db366004612b8a565b6001600160a01b03908116600090815260fe60205260409020541690565b6102cc610407366004612b8a565b61098e565b61041f61041a366004612b8a565b61099b565b60405163ffffffff9091168152602001610293565b6102d2610442366004612b8a565b6001600160a01b031660009081526065602052604090205490565b6102cc6109c3565b610287610473366004612b8a565b6101346020526000908152604090205460ff1681565b6102d2610497366004612b8a565b6109d7565b6102d26104aa366004612b8a565b6101316020526000908152604090205481565b6104c56109f5565b6040516102939796959493929190612cb0565b6033546001600160a01b031661036a565b6102d26104f7366004612d46565b610a93565b610504610afb565b60405165ffffffffffff9091168152602001610293565b6102a4610b06565b6102d2610531366004612b8a565b610b15565b6102d26101325481565b61028761054e366004612c05565b610b97565b6102cc610561366004612e35565b610c12565b610287610574366004612c05565b61103f565b6102cc610587366004612f78565b61104d565b6102cc61059a366004612c3d565b611128565b6102cc6105ad366004612ff5565b611189565b6102cc6105c036600461304d565b6112bf565b6102d26105d33660046130b7565b611423565b6102cc6105e6366004612d46565b61144e565b6102cc6105f9366004612d46565b611542565b6102cc61163b565b6106196106143660046130ea565b611704565b60408051825163ffffffff1681526020928301516001600160e01b03169281019290925201610293565b6102cc610651366004612b8a565b611788565b6060606880546106659061311f565b80601f01602080910402602001604051908101604052809291908181526020018280546106919061311f565b80156106de5780601f106106b3576101008083540402835291602001916106de565b820191906000526020600020905b8154815290600101906020018083116106c157829003601f168201915b5050505050905090565b6000336106f68185856117fe565b5060019392505050565b336000908152610131602052604090205461077a5760405162461bcd60e51b815260206004820152602f60248201527f456967656e2e6d696e743a206d73672e73656e64657220686173206e6f206d6960448201526e6e74696e6720616c6c6f77616e636560881b60648201526084015b60405180910390fd5b336000908152610130602052604090205442116107f35760405162461bcd60e51b815260206004820152603160248201527f456967656e2e6d696e743a206d73672e73656e646572206973206e6f7420616c6044820152701b1bddd959081d1bc81b5a5b9d081e595d607a1b6064820152608401610771565b336000818152610131602052604081208054919055906108139082611922565b60405181815233907f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d41213968859060200160405180910390a250565b6108536119b3565b6001600160a01b03821660008181526101336020908152604091829020805460ff191685151590811790915591519182527fcf20b1ecb604b0e8888d579c64e8a3b10e590d45c1c2dddb393bed284362227191015b60405180910390a25050565b6000336108c2858285611a0d565b6108cd858585611a81565b506001949350505050565b60006108e2611c3d565b905090565b6000336106f68185856108fa8383611423565b610904919061316a565b6117fe565b6000610913610afb565b65ffffffffffff1682106109655760405162461bcd60e51b815260206004820152601960248201527804552433230566f7465733a20667574757265206c6f6f6b757603c1b6044820152606401610771565b6001600160a01b038316600090815260ff602052604090206109879083611c47565b9392505050565b6109983382611d30565b50565b6001600160a01b038116600090815260ff60205260408120546109bd90611daa565b92915050565b6109cb6119b3565b6109d56000611e13565b565b6001600160a01b038116600090815260cb60205260408120546109bd565b6000606080600080600060606097546000801b148015610a155750609854155b610a595760405162461bcd60e51b81526020600482015260156024820152741152540dcc4c8e88155b9a5b9a5d1a585b1a5e9959605a1b6044820152606401610771565b610a61611e65565b610a69611e74565b60408051600080825260208201909252600f60f81b9b939a50919850469750309650945092509050565b6000610a9d610afb565b65ffffffffffff168210610aef5760405162461bcd60e51b815260206004820152601960248201527804552433230566f7465733a20667574757265206c6f6f6b757603c1b6044820152606401610771565b6109bd61010083611c47565b60006108e242611e83565b6060606980546106659061311f565b6001600160a01b038116600090815260ff60205260408120548015610b84576001600160a01b038316600090815260ff6020526040902080546000198301908110610b6257610b62613182565b60009182526020909120015464010000000090046001600160e01b0316610b87565b60005b6001600160e01b03169392505050565b60003381610ba58286611423565b905083811015610c055760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610771565b6108cd82868684036117fe565b600054610100900460ff1615808015610c325750600054600160ff909116105b80610c4c5750303b158015610c4c575060005460ff166001145b610caf5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610771565b6000805460ff191660011790558015610cd2576000805461ff0019166101001790555b610cda611eea565b610d1e6040518060400160405280600581526020016422b4b3b2b760d91b8152506040518060400160405280600581526020016422a4a3a2a760d91b815250611f19565b610d2785611e13565b610d4d6040518060400160405280600581526020016422a4a3a2a760d91b815250611f4e565b8251845114610dd45760405162461bcd60e51b815260206004820152604760248201527f456967656e2e696e697469616c697a653a206d696e7465727320616e64206d6960448201527f6e74696e67416c6c6f77616e636573206d757374206265207468652073616d65606482015266040d8cadccee8d60cb1b608482015260a401610771565b8151845114610e5b5760405162461bcd60e51b815260206004820152604760248201527f456967656e2e696e697469616c697a653a206d696e7465727320616e64206d6960448201527f6e74416c6c6f776564416674657273206d757374206265207468652073616d65606482015266040d8cadccee8d60cb1b608482015260a401610771565b60005b8451811015610fea57838181518110610e7957610e79613182565b60200260200101516101316000878481518110610e9857610e98613182565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002081905550828181518110610ed657610ed6613182565b60200260200101516101306000878481518110610ef557610ef5613182565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000208190555060016101336000878481518110610f3a57610f3a613182565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff021916908315150217905550848181518110610f8b57610f8b613182565b60200260200101516001600160a01b03167fcf20b1ecb604b0e8888d579c64e8a3b10e590d45c1c2dddb393bed28436222716001604051610fd0911515815260200190565b60405180910390a280610fe281613198565b915050610e5e565b50600019610132558015611038576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050565b6000336106f6818585611a81565b8281146110c25760405162461bcd60e51b815260206004820152603e60248201527f456967656e2e6d756c746973656e643a2072656365697665727320616e64206160448201527f6d6f756e7473206d757374206265207468652073616d65206c656e67746800006064820152608401610771565b60005b8381101561103857611116338686848181106110e3576110e3613182565b90506020020160208101906110f89190612b8a565b85858581811061110a5761110a613182565b90506020020135611a81565b8061112081613198565b9150506110c5565b6111306119b3565b6001600160a01b03821660008181526101346020908152604091829020805460ff191685151590811790915591519182527f72a561d1af7409467dae4f1e9fc52590a9335a1dda17727e2b6aa8c4db35109b91016108a8565b834211156111d95760405162461bcd60e51b815260206004820152601d60248201527f4552433230566f7465733a207369676e617475726520657870697265640000006044820152606401610771565b604080517fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf60208201526001600160a01b0388169181019190915260608101869052608081018590526000906112539061124b9060a00160405160208183030381529060405280519060200120611f98565b858585611fc5565b905061125e81611fed565b86146112ac5760405162461bcd60e51b815260206004820152601960248201527f4552433230566f7465733a20696e76616c6964206e6f6e6365000000000000006044820152606401610771565b6112b68188611d30565b50505050505050565b8342111561130f5760405162461bcd60e51b815260206004820152601d60248201527f45524332305065726d69743a206578706972656420646561646c696e650000006044820152606401610771565b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c988888861133e8c611fed565b6040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e001604051602081830303815290604052805190602001209050600061139982611f98565b905060006113a982878787611fc5565b9050896001600160a01b0316816001600160a01b03161461140c5760405162461bcd60e51b815260206004820152601e60248201527f45524332305065726d69743a20696e76616c6964207369676e617475726500006044820152606401610771565b6114178a8a8a6117fe565b50505050505050505050565b6001600160a01b03918216600090815260666020908152604080832093909416825291909152205490565b611459333083611a81565b60405163a9059cbb60e01b8152336004820152602481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063a9059cbb906044016020604051808303816000875af11580156114c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114ea91906131b3565b6109985760405162461bcd60e51b8152602060048201526024808201527f456967656e2e756e777261703a2062454947454e207472616e736665722066616044820152631a5b195960e21b6064820152608401610771565b6040516323b872dd60e01b8152336004820152306024820152604481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906323b872dd906064016020604051808303816000875af11580156115b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115d991906131b3565b6116305760405162461bcd60e51b815260206004820152602260248201527f456967656e2e777261703a2062454947454e207472616e73666572206661696c604482015261195960f21b6064820152608401610771565b610998303383611a81565b6116436119b3565b60001961013254146116d35760405162461bcd60e51b815260206004820152604d60248201527f456967656e2e64697361626c655472616e736665725265737472696374696f6e60448201527f733a207472616e73666572207265737472696374696f6e732061726520616c7260648201526c1958591e48191a5cd8589b1959609a1b608482015260a401610771565b60006101328190556040517f2b18986d3ba809db2f13a5d7bf17f60d357b37d9cbb55dd71cbbac8dc4060f649190a1565b60408051808201909152600080825260208201526001600160a01b038316600090815260ff60205260409020805463ffffffff841690811061174857611748613182565b60009182526020918290206040805180820190915291015463ffffffff8116825264010000000090046001600160e01b0316918101919091529392505050565b6117906119b3565b6001600160a01b0381166117f55760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610771565b61099881611e13565b6001600160a01b0383166118605760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610771565b6001600160a01b0382166118c15760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610771565b6001600160a01b0383811660008181526066602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b61192c8282612015565b6067546001600160e01b03101561199e5760405162461bcd60e51b815260206004820152603060248201527f4552433230566f7465733a20746f74616c20737570706c79207269736b73206f60448201526f766572666c6f77696e6720766f74657360801b6064820152608401610771565b6119ad6101006120ea836120f6565b50505050565b6033546001600160a01b031633146109d55760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610771565b6000611a198484611423565b905060001981146119ad5781811015611a745760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610771565b6119ad84848484036117fe565b6001600160a01b038316611ae55760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610771565b6001600160a01b038216611b475760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610771565b611b5283838361226b565b6001600160a01b03831660009081526065602052604090205481811015611bca5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610771565b6001600160a01b0380851660008181526065602052604080822086860390559286168082529083902080548601905591517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90611c2a9086815260200190565b60405180910390a36119ad848484612365565b60006108e2612397565b815460009081816005811115611ca1576000611c628461240b565b611c6c90856131d0565b600088815260209020909150869082015463ffffffff161115611c9157809150611c9f565b611c9c81600161316a565b92505b505b80821015611cee576000611cb583836124f0565b600088815260209020909150869082015463ffffffff161115611cda57809150611ce8565b611ce581600161316a565b92505b50611ca1565b8015611d1a576000868152602090208101600019015464010000000090046001600160e01b0316611d1d565b60005b6001600160e01b03169695505050505050565b6001600160a01b03828116600081815260fe6020818152604080842080546065845282862054949093528787166001600160a01b03198416811790915590519190951694919391928592917f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a46119ad82848361250b565b600063ffffffff821115611e0f5760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203360448201526532206269747360d01b6064820152608401610771565b5090565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6060609980546106659061311f565b6060609a80546106659061311f565b600065ffffffffffff821115611e0f5760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203460448201526538206269747360d01b6064820152608401610771565b600054610100900460ff16611f115760405162461bcd60e51b8152600401610771906131e7565b6109d5612648565b600054610100900460ff16611f405760405162461bcd60e51b8152600401610771906131e7565b611f4a8282612678565b5050565b600054610100900460ff16611f755760405162461bcd60e51b8152600401610771906131e7565b61099881604051806040016040528060018152602001603160f81b8152506126c6565b60006109bd611fa5611c3d565b8360405161190160f01b8152600281019290925260228201526042902090565b6000806000611fd687878787612723565b91509150611fe3816127e7565b5095945050505050565b6001600160a01b038116600090815260cb602052604090208054600181018255905b50919050565b6001600160a01b03821661206b5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610771565b6120776000838361226b565b8060676000828254612089919061316a565b90915550506001600160a01b0382166000818152606560209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3611f4a60008383612365565b6000610987828461316a565b825460009081908181156121435760008781526020902082016000190160408051808201909152905463ffffffff8116825264010000000090046001600160e01b03166020820152612158565b60408051808201909152600080825260208201525b905080602001516001600160e01b0316935061217884868863ffffffff16565b92506000821180156121a2575061218d610afb565b65ffffffffffff16816000015163ffffffff16145b156121e7576121b083612935565b60008881526020902083016000190180546001600160e01b03929092166401000000000263ffffffff909216919091179055612261565b86604051806040016040528061220b6121fe610afb565b65ffffffffffff16611daa565b63ffffffff16815260200161221f86612935565b6001600160e01b0390811690915282546001810184556000938452602093849020835194909301519091166401000000000263ffffffff909316929092179101555b5050935093915050565b610132544211612360576001600160a01b038316158061229357506001600160a01b03831630145b806122a657506001600160a01b03821630145b806122ca57506001600160a01b0383166000908152610133602052604090205460ff165b806122ee57506001600160a01b0382166000908152610134602052604090205460ff165b6123605760405162461bcd60e51b815260206004820152603a60248201527f456967656e2e5f6265666f7265546f6b656e5472616e736665723a2066726f6d60448201527f206f7220746f206d7573742062652077686974656c69737465640000000000006064820152608401610771565b505050565b6001600160a01b03838116600090815260fe60205260408082205485841683529120546123609291821691168361250b565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6123c261299e565b6123ca6129f7565b60408051602081019490945283019190915260608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b60008161241a57506000919050565b6000600161242784612a28565b901c6001901b9050600181848161244057612440613232565b048201901c9050600181848161245857612458613232565b048201901c9050600181848161247057612470613232565b048201901c9050600181848161248857612488613232565b048201901c905060018184816124a0576124a0613232565b048201901c905060018184816124b8576124b8613232565b048201901c905060018184816124d0576124d0613232565b048201901c9050610987818285816124ea576124ea613232565b04612abc565b60006124ff6002848418613248565b6109879084841661316a565b816001600160a01b0316836001600160a01b03161415801561252d5750600081115b15612360576001600160a01b038316156125bb576001600160a01b038316600090815260ff60205260408120819061256890612ad2856120f6565b91509150846001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a72483836040516125b0929190918252602082015260400190565b60405180910390a250505b6001600160a01b03821615612360576001600160a01b038216600090815260ff6020526040812081906125f1906120ea856120f6565b91509150836001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051612639929190918252602082015260400190565b60405180910390a25050505050565b600054610100900460ff1661266f5760405162461bcd60e51b8152600401610771906131e7565b6109d533611e13565b600054610100900460ff1661269f5760405162461bcd60e51b8152600401610771906131e7565b81516126b2906068906020850190612ade565b508051612360906069906020840190612ade565b600054610100900460ff166126ed5760405162461bcd60e51b8152600401610771906131e7565b8151612700906099906020850190612ade565b50805161271490609a906020840190612ade565b50506000609781905560985550565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561275a57506000905060036127de565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156127ae573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166127d7576000600192509250506127de565b9150600090505b94509492505050565b60008160048111156127fb576127fb61326a565b14156128045750565b60018160048111156128185761281861326a565b14156128665760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610771565b600281600481111561287a5761287a61326a565b14156128c85760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610771565b60038160048111156128dc576128dc61326a565b14156109985760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610771565b60006001600160e01b03821115611e0f5760405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e20326044820152663234206269747360c81b6064820152608401610771565b6000806129a9611e65565b8051909150156129c0578051602090910120919050565b60975480156129cf5792915050565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4709250505090565b600080612a02611e74565b805190915015612a19578051602090910120919050565b60985480156129cf5792915050565b600080608083901c15612a3d57608092831c92015b604083901c15612a4f57604092831c92015b602083901c15612a6157602092831c92015b601083901c15612a7357601092831c92015b600883901c15612a8557600892831c92015b600483901c15612a9757600492831c92015b600283901c15612aa957600292831c92015b600183901c156109bd5760010192915050565b6000818310612acb5781610987565b5090919050565b600061098782846131d0565b828054612aea9061311f565b90600052602060002090601f016020900481019282612b0c5760008555612b52565b82601f10612b2557805160ff1916838001178555612b52565b82800160010185558215612b52579182015b82811115612b52578251825591602001919060010190612b37565b50611e0f9291505b80821115611e0f5760008155600101612b5a565b80356001600160a01b0381168114612b8557600080fd5b919050565b600060208284031215612b9c57600080fd5b61098782612b6e565b6000815180845260005b81811015612bcb57602081850181015186830182015201612baf565b81811115612bdd576000602083870101525b50601f01601f19169290920160200192915050565b6020815260006109876020830184612ba5565b60008060408385031215612c1857600080fd5b612c2183612b6e565b946020939093013593505050565b801515811461099857600080fd5b60008060408385031215612c5057600080fd5b612c5983612b6e565b91506020830135612c6981612c2f565b809150509250929050565b600080600060608486031215612c8957600080fd5b612c9284612b6e565b9250612ca060208501612b6e565b9150604084013590509250925092565b60ff60f81b881681526000602060e081840152612cd060e084018a612ba5565b8381036040850152612ce2818a612ba5565b606085018990526001600160a01b038816608086015260a0850187905284810360c0860152855180825283870192509083019060005b81811015612d3457835183529284019291840191600101612d18565b50909c9b505050505050505050505050565b600060208284031215612d5857600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715612d9e57612d9e612d5f565b604052919050565b600067ffffffffffffffff821115612dc057612dc0612d5f565b5060051b60200190565b600082601f830112612ddb57600080fd5b81356020612df0612deb83612da6565b612d75565b82815260059290921b84018101918181019086841115612e0f57600080fd5b8286015b84811015612e2a5780358352918301918301612e13565b509695505050505050565b60008060008060808587031215612e4b57600080fd5b612e5485612b6e565b935060208086013567ffffffffffffffff80821115612e7257600080fd5b818801915088601f830112612e8657600080fd5b8135612e94612deb82612da6565b81815260059190911b8301840190848101908b831115612eb357600080fd5b938501935b82851015612ed857612ec985612b6e565b82529385019390850190612eb8565b975050506040880135925080831115612ef057600080fd5b612efc89848a01612dca565b94506060880135925080831115612f1257600080fd5b5050612f2087828801612dca565b91505092959194509250565b60008083601f840112612f3e57600080fd5b50813567ffffffffffffffff811115612f5657600080fd5b6020830191508360208260051b8501011115612f7157600080fd5b9250929050565b60008060008060408587031215612f8e57600080fd5b843567ffffffffffffffff80821115612fa657600080fd5b612fb288838901612f2c565b90965094506020870135915080821115612fcb57600080fd5b50612fd887828801612f2c565b95989497509550505050565b803560ff81168114612b8557600080fd5b60008060008060008060c0878903121561300e57600080fd5b61301787612b6e565b9550602087013594506040870135935061303360608801612fe4565b92506080870135915060a087013590509295509295509295565b600080600080600080600060e0888a03121561306857600080fd5b61307188612b6e565b965061307f60208901612b6e565b9550604088013594506060880135935061309b60808901612fe4565b925060a0880135915060c0880135905092959891949750929550565b600080604083850312156130ca57600080fd5b6130d383612b6e565b91506130e160208401612b6e565b90509250929050565b600080604083850312156130fd57600080fd5b61310683612b6e565b9150602083013563ffffffff81168114612c6957600080fd5b600181811c9082168061313357607f821691505b6020821081141561200f57634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000821982111561317d5761317d613154565b500190565b634e487b7160e01b600052603260045260246000fd5b60006000198214156131ac576131ac613154565b5060010190565b6000602082840312156131c557600080fd5b815161098781612c2f565b6000828210156131e2576131e2613154565b500390565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b634e487b7160e01b600052601260045260246000fd5b60008261326557634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052602160045260246000fdfea2646970667358221220e4ee2d6f1ea92311c558c0a9f0569a6bf43ef4fd4d69cf13ea69ec8c5e2bf86a64736f6c634300080c0033", + Bin: "0x60a060405234801561001057600080fd5b5060405161343c38038061343c83398101604081905261002f91610109565b6001600160a01b03811660805261004461004a565b50610139565b600054610100900460ff16156100b65760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff90811614610107576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b60006020828403121561011b57600080fd5b81516001600160a01b038116811461013257600080fd5b9392505050565b6080516132da610162600039600081816103480152818161145d015261154c01526132da6000f3fe608060405234801561001057600080fd5b506004361061025e5760003560e01c806381b9716111610146578063a9059cbb116100c3578063dd62ed3e11610087578063dd62ed3e146105c5578063de0e9a3e146105d8578063ea598cb0146105eb578063eb415f45146105fe578063f1127ed814610606578063f2fde38b1461064357600080fd5b8063a9059cbb14610566578063aad41a4114610579578063b8c255941461058c578063c3cda5201461059f578063d505accf146105b257600080fd5b806395d89b411161010a57806395d89b411461051b5780639ab24eb0146105235780639aec4bae14610536578063a457c2d714610540578063a7d1195d1461055357600080fd5b806381b971611461049c57806384b0196e146104bd5780638da5cb5b146104d85780638e539e8c146104e957806391ddadf4146104fc57600080fd5b80633a46b1a8116101df5780635c19a95c116101a35780635c19a95c146103f95780636fcfff451461040c57806370a0823114610434578063715018a61461045d57806378aa33ba146104655780637ecebe001461048957600080fd5b80633a46b1a8146103305780633f4da4c6146103435780634bf5d7e91461038257806353957125146103ac578063587cde1e146103cd57600080fd5b80631ffacdef116102265780631ffacdef146102e057806323b872dd146102f3578063313ce567146103065780633644e51514610315578063395093511461031d57600080fd5b80630455e6941461026357806306fdde031461029c578063095ea7b3146102b15780631249c58b146102c457806318160ddd146102ce575b600080fd5b610287610271366004612ac5565b6101336020526000908152604090205460ff1681565b60405190151581526020015b60405180910390f35b6102a4610656565b6040516102939190612b26565b6102876102bf366004612b39565b6106e8565b6102cc610702565b005b6067545b604051908152602001610293565b6102cc6102ee366004612b71565b61084d565b610287610301366004612ba8565b6108b6565b60405160128152602001610293565b6102d26108da565b61028761032b366004612b39565b6108e9565b6102d261033e366004612b39565b61090b565b61036a7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610293565b60408051808201909152600e81526d06d6f64653d74696d657374616d760941b60208201526102a4565b6102d26103ba366004612ac5565b6101306020526000908152604090205481565b61036a6103db366004612ac5565b6001600160a01b03908116600090815260fe60205260409020541690565b6102cc610407366004612ac5565b610990565b61041f61041a366004612ac5565b61099d565b60405163ffffffff9091168152602001610293565b6102d2610442366004612ac5565b6001600160a01b031660009081526065602052604090205490565b6102cc6109bf565b610287610473366004612ac5565b6101346020526000908152604090205460ff1681565b6102d2610497366004612ac5565b6109d3565b6102d26104aa366004612ac5565b6101316020526000908152604090205481565b6104c56109f1565b6040516102939796959493929190612be5565b6033546001600160a01b031661036a565b6102d26104f7366004612c7d565b610a8f565b610504610af7565b60405165ffffffffffff9091168152602001610293565b6102a4610b02565b6102d2610531366004612ac5565b610b11565b6102d26101325481565b61028761054e366004612b39565b610b93565b6102cc610561366004612d64565b610c0e565b610287610574366004612b39565b611031565b6102cc610587366004612eb5565b61103f565b6102cc61059a366004612b71565b611110565b6102cc6105ad366004612f37565b611171565b6102cc6105c0366004612f8f565b6112a7565b6102d26105d3366004612ffa565b61140b565b6102cc6105e6366004612c7d565b611436565b6102cc6105f9366004612c7d565b61152a565b6102cc611623565b61061961061436600461302d565b6116ec565b60408051825163ffffffff1681526020928301516001600160e01b03169281019290925201610293565b6102cc610651366004612ac5565b611770565b60606068805461066590613062565b80601f016020809104026020016040519081016040528092919081815260200182805461069190613062565b80156106de5780601f106106b3576101008083540402835291602001916106de565b820191906000526020600020905b8154815290600101906020018083116106c157829003601f168201915b5050505050905090565b6000336106f68185856117e6565b60019150505b92915050565b336000908152610131602052604090205461077c5760405162461bcd60e51b815260206004820152602f60248201527f456967656e2e6d696e743a206d73672e73656e64657220686173206e6f206d6960448201526e6e74696e6720616c6c6f77616e636560881b60648201526084015b60405180910390fd5b336000908152610130602052604090205442116107f55760405162461bcd60e51b815260206004820152603160248201527f456967656e2e6d696e743a206d73672e73656e646572206973206e6f7420616c6044820152701b1bddd959081d1bc81b5a5b9d081e595d607a1b6064820152608401610773565b33600081815261013160205260408120805491905590610815908261190a565b60405181815233907f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d41213968859060200160405180910390a250565b61085561199b565b6001600160a01b03821660008181526101336020908152604091829020805460ff191685151590811790915591519182527fcf20b1ecb604b0e8888d579c64e8a3b10e590d45c1c2dddb393bed284362227191015b60405180910390a25050565b6000336108c48582856119f5565b6108cf858585611a69565b506001949350505050565b60006108e4611c25565b905090565b6000336106f68185856108fc838361140b565b61090691906130ac565b6117e6565b6000610915610af7565b65ffffffffffff1682106109675760405162461bcd60e51b815260206004820152601960248201527804552433230566f7465733a20667574757265206c6f6f6b757603c1b6044820152606401610773565b6001600160a01b038316600090815260ff602052604090206109899083611c2f565b9392505050565b61099a3382611d18565b50565b6001600160a01b038116600090815260ff60205260408120546106fc90611d92565b6109c761199b565b6109d16000611dfb565b565b6001600160a01b038116600090815260cb60205260408120546106fc565b6000606080600080600060606097546000801b148015610a115750609854155b610a555760405162461bcd60e51b81526020600482015260156024820152741152540dcc4c8e88155b9a5b9a5d1a585b1a5e9959605a1b6044820152606401610773565b610a5d611e4d565b610a65611e5c565b60408051600080825260208201909252600f60f81b9b939a50919850469750309650945092509050565b6000610a99610af7565b65ffffffffffff168210610aeb5760405162461bcd60e51b815260206004820152601960248201527804552433230566f7465733a20667574757265206c6f6f6b757603c1b6044820152606401610773565b6106fc61010083611c2f565b60006108e442611e6b565b60606069805461066590613062565b6001600160a01b038116600090815260ff60205260408120548015610b80576001600160a01b038316600090815260ff6020526040902080546000198301908110610b5e57610b5e6130bf565b60009182526020909120015464010000000090046001600160e01b0316610b83565b60005b6001600160e01b03169392505050565b60003381610ba1828661140b565b905083811015610c015760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610773565b6108cf82868684036117e6565b600054610100900460ff1615808015610c2e5750600054600160ff909116105b80610c485750303b158015610c48575060005460ff166001145b610cab5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610773565b6000805460ff191660011790558015610cce576000805461ff0019166101001790555b610cd6611ed2565b610d1a6040518060400160405280600581526020016422b4b3b2b760d91b8152506040518060400160405280600581526020016422a4a3a2a760d91b815250611f01565b610d2385611dfb565b610d496040518060400160405280600581526020016422a4a3a2a760d91b815250611f36565b8251845114610dd05760405162461bcd60e51b815260206004820152604760248201527f456967656e2e696e697469616c697a653a206d696e7465727320616e64206d6960448201527f6e74696e67416c6c6f77616e636573206d757374206265207468652073616d65606482015266040d8cadccee8d60cb1b608482015260a401610773565b8151845114610e575760405162461bcd60e51b815260206004820152604760248201527f456967656e2e696e697469616c697a653a206d696e7465727320616e64206d6960448201527f6e74416c6c6f776564416674657273206d757374206265207468652073616d65606482015266040d8cadccee8d60cb1b608482015260a401610773565b60005b8451811015610fdc57838181518110610e7557610e756130bf565b60200260200101516101316000878481518110610e9457610e946130bf565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002081905550828181518110610ed257610ed26130bf565b60200260200101516101306000878481518110610ef157610ef16130bf565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000208190555060016101336000878481518110610f3657610f366130bf565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff021916908315150217905550848181518110610f8757610f876130bf565b60200260200101516001600160a01b03167fcf20b1ecb604b0e8888d579c64e8a3b10e590d45c1c2dddb393bed28436222716001604051610fcc911515815260200190565b60405180910390a2600101610e5a565b5060001961013255801561102a576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050565b6000336106f6818585611a69565b8281146110b45760405162461bcd60e51b815260206004820152603e60248201527f456967656e2e6d756c746973656e643a2072656365697665727320616e64206160448201527f6d6f756e7473206d757374206265207468652073616d65206c656e67746800006064820152608401610773565b60005b8381101561102a57611108338686848181106110d5576110d56130bf565b90506020020160208101906110ea9190612ac5565b8585858181106110fc576110fc6130bf565b90506020020135611a69565b6001016110b7565b61111861199b565b6001600160a01b03821660008181526101346020908152604091829020805460ff191685151590811790915591519182527f72a561d1af7409467dae4f1e9fc52590a9335a1dda17727e2b6aa8c4db35109b91016108aa565b834211156111c15760405162461bcd60e51b815260206004820152601d60248201527f4552433230566f7465733a207369676e617475726520657870697265640000006044820152606401610773565b604080517fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf60208201526001600160a01b03881691810191909152606081018690526080810185905260009061123b906112339060a00160405160208183030381529060405280519060200120611f80565b858585611fad565b905061124681611fd5565b86146112945760405162461bcd60e51b815260206004820152601960248201527f4552433230566f7465733a20696e76616c6964206e6f6e6365000000000000006044820152606401610773565b61129e8188611d18565b50505050505050565b834211156112f75760405162461bcd60e51b815260206004820152601d60248201527f45524332305065726d69743a206578706972656420646561646c696e650000006044820152606401610773565b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98888886113268c611fd5565b6040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e001604051602081830303815290604052805190602001209050600061138182611f80565b9050600061139182878787611fad565b9050896001600160a01b0316816001600160a01b0316146113f45760405162461bcd60e51b815260206004820152601e60248201527f45524332305065726d69743a20696e76616c6964207369676e617475726500006044820152606401610773565b6113ff8a8a8a6117e6565b50505050505050505050565b6001600160a01b03918216600090815260666020908152604080832093909416825291909152205490565b611441333083611a69565b60405163a9059cbb60e01b8152336004820152602481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063a9059cbb906044016020604051808303816000875af11580156114ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114d291906130d5565b61099a5760405162461bcd60e51b8152602060048201526024808201527f456967656e2e756e777261703a2062454947454e207472616e736665722066616044820152631a5b195960e21b6064820152608401610773565b6040516323b872dd60e01b8152336004820152306024820152604481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906323b872dd906064016020604051808303816000875af115801561159d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115c191906130d5565b6116185760405162461bcd60e51b815260206004820152602260248201527f456967656e2e777261703a2062454947454e207472616e73666572206661696c604482015261195960f21b6064820152608401610773565b61099a303383611a69565b61162b61199b565b60001961013254146116bb5760405162461bcd60e51b815260206004820152604d60248201527f456967656e2e64697361626c655472616e736665725265737472696374696f6e60448201527f733a207472616e73666572207265737472696374696f6e732061726520616c7260648201526c1958591e48191a5cd8589b1959609a1b608482015260a401610773565b60006101328190556040517f2b18986d3ba809db2f13a5d7bf17f60d357b37d9cbb55dd71cbbac8dc4060f649190a1565b60408051808201909152600080825260208201526001600160a01b038316600090815260ff60205260409020805463ffffffff8416908110611730576117306130bf565b60009182526020918290206040805180820190915291015463ffffffff8116825264010000000090046001600160e01b0316918101919091529392505050565b61177861199b565b6001600160a01b0381166117dd5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610773565b61099a81611dfb565b6001600160a01b0383166118485760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610773565b6001600160a01b0382166118a95760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610773565b6001600160a01b0383811660008181526066602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6119148282611ffd565b6067546001600160e01b0310156119865760405162461bcd60e51b815260206004820152603060248201527f4552433230566f7465733a20746f74616c20737570706c79207269736b73206f60448201526f766572666c6f77696e6720766f74657360801b6064820152608401610773565b6119956101006120d2836120de565b50505050565b6033546001600160a01b031633146109d15760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610773565b6000611a01848461140b565b905060001981146119955781811015611a5c5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610773565b61199584848484036117e6565b6001600160a01b038316611acd5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610773565b6001600160a01b038216611b2f5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610773565b611b3a838383612253565b6001600160a01b03831660009081526065602052604090205481811015611bb25760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610773565b6001600160a01b0380851660008181526065602052604080822086860390559286168082529083902080548601905591517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90611c129086815260200190565b60405180910390a361199584848461234d565b60006108e461237f565b815460009081816005811115611c89576000611c4a846123f3565b611c5490856130f2565b600088815260209020909150869082015463ffffffff161115611c7957809150611c87565b611c848160016130ac565b92505b505b80821015611cd6576000611c9d83836124db565b600088815260209020909150869082015463ffffffff161115611cc257809150611cd0565b611ccd8160016130ac565b92505b50611c89565b8015611d02576000868152602090208101600019015464010000000090046001600160e01b0316611d05565b60005b6001600160e01b03169695505050505050565b6001600160a01b03828116600081815260fe6020818152604080842080546065845282862054949093528787166001600160a01b03198416811790915590519190951694919391928592917f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a46119958284836124f6565b600063ffffffff821115611df75760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203360448201526532206269747360d01b6064820152608401610773565b5090565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60606099805461066590613062565b6060609a805461066590613062565b600065ffffffffffff821115611df75760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203460448201526538206269747360d01b6064820152608401610773565b600054610100900460ff16611ef95760405162461bcd60e51b815260040161077390613105565b6109d1612633565b600054610100900460ff16611f285760405162461bcd60e51b815260040161077390613105565b611f328282612663565b5050565b600054610100900460ff16611f5d5760405162461bcd60e51b815260040161077390613105565b61099a81604051806040016040528060018152602001603160f81b8152506126a3565b60006106fc611f8d611c25565b8360405161190160f01b8152600281019290925260228201526042902090565b6000806000611fbe878787876126f2565b91509150611fcb816127b6565b5095945050505050565b6001600160a01b038116600090815260cb602052604090208054600181018255905b50919050565b6001600160a01b0382166120535760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610773565b61205f60008383612253565b806067600082825461207191906130ac565b90915550506001600160a01b0382166000818152606560209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3611f326000838361234d565b600061098982846130ac565b8254600090819081811561212b5760008781526020902082016000190160408051808201909152905463ffffffff8116825264010000000090046001600160e01b03166020820152612140565b60408051808201909152600080825260208201525b905080602001516001600160e01b0316935061216084868863ffffffff16565b925060008211801561218a5750612175610af7565b65ffffffffffff16816000015163ffffffff16145b156121cf5761219883612900565b60008881526020902083016000190180546001600160e01b03929092166401000000000263ffffffff909216919091179055612249565b8660405180604001604052806121f36121e6610af7565b65ffffffffffff16611d92565b63ffffffff16815260200161220786612900565b6001600160e01b0390811690915282546001810184556000938452602093849020835194909301519091166401000000000263ffffffff909316929092179101555b5050935093915050565b610132544211612348576001600160a01b038316158061227b57506001600160a01b03831630145b8061228e57506001600160a01b03821630145b806122b257506001600160a01b0383166000908152610133602052604090205460ff165b806122d657506001600160a01b0382166000908152610134602052604090205460ff165b6123485760405162461bcd60e51b815260206004820152603a60248201527f456967656e2e5f6265666f7265546f6b656e5472616e736665723a2066726f6d60448201527f206f7220746f206d7573742062652077686974656c69737465640000000000006064820152608401610773565b505050565b6001600160a01b03838116600090815260fe6020526040808220548584168352912054612348929182169116836124f6565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6123aa612969565b6123b26129c2565b60408051602081019490945283019190915260608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b60008160000361240557506000919050565b60006001612412846129f3565b901c6001901b9050600181848161242b5761242b613150565b048201901c9050600181848161244357612443613150565b048201901c9050600181848161245b5761245b613150565b048201901c9050600181848161247357612473613150565b048201901c9050600181848161248b5761248b613150565b048201901c905060018184816124a3576124a3613150565b048201901c905060018184816124bb576124bb613150565b048201901c9050610989818285816124d5576124d5613150565b04612a87565b60006124ea6002848418613166565b610989908484166130ac565b816001600160a01b0316836001600160a01b0316141580156125185750600081115b15612348576001600160a01b038316156125a6576001600160a01b038316600090815260ff60205260408120819061255390612a9d856120de565b91509150846001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a724838360405161259b929190918252602082015260400190565b60405180910390a250505b6001600160a01b03821615612348576001600160a01b038216600090815260ff6020526040812081906125dc906120d2856120de565b91509150836001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051612624929190918252602082015260400190565b60405180910390a25050505050565b600054610100900460ff1661265a5760405162461bcd60e51b815260040161077390613105565b6109d133611dfb565b600054610100900460ff1661268a5760405162461bcd60e51b815260040161077390613105565b606861269683826131cf565b50606961234882826131cf565b600054610100900460ff166126ca5760405162461bcd60e51b815260040161077390613105565b60996126d683826131cf565b50609a6126e382826131cf565b50506000609781905560985550565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561272957506000905060036127ad565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa15801561277d573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166127a6576000600192509250506127ad565b9150600090505b94509492505050565b60008160048111156127ca576127ca61328e565b036127d25750565b60018160048111156127e6576127e661328e565b036128335760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610773565b60028160048111156128475761284761328e565b036128945760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610773565b60038160048111156128a8576128a861328e565b0361099a5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610773565b60006001600160e01b03821115611df75760405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e20326044820152663234206269747360c81b6064820152608401610773565b600080612974611e4d565b80519091501561298b578051602090910120919050565b609754801561299a5792915050565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4709250505090565b6000806129cd611e5c565b8051909150156129e4578051602090910120919050565b609854801561299a5792915050565b600080608083901c15612a0857608092831c92015b604083901c15612a1a57604092831c92015b602083901c15612a2c57602092831c92015b601083901c15612a3e57601092831c92015b600883901c15612a5057600892831c92015b600483901c15612a6257600492831c92015b600283901c15612a7457600292831c92015b600183901c156106fc5760010192915050565b6000818310612a965781610989565b5090919050565b600061098982846130f2565b80356001600160a01b0381168114612ac057600080fd5b919050565b600060208284031215612ad757600080fd5b61098982612aa9565b6000815180845260005b81811015612b0657602081850181015186830182015201612aea565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006109896020830184612ae0565b60008060408385031215612b4c57600080fd5b612b5583612aa9565b946020939093013593505050565b801515811461099a57600080fd5b60008060408385031215612b8457600080fd5b612b8d83612aa9565b91506020830135612b9d81612b63565b809150509250929050565b600080600060608486031215612bbd57600080fd5b612bc684612aa9565b9250612bd460208501612aa9565b929592945050506040919091013590565b60ff60f81b8816815260e060208201526000612c0460e0830189612ae0565b8281036040840152612c168189612ae0565b606084018890526001600160a01b038716608085015260a0840186905283810360c08501528451808252602080870193509091019060005b81811015612c6c578351835260209384019390920191600101612c4e565b50909b9a5050505050505050505050565b600060208284031215612c8f57600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715612cd557612cd5612c96565b604052919050565b600067ffffffffffffffff821115612cf757612cf7612c96565b5060051b60200190565b600082601f830112612d1257600080fd5b8135612d25612d2082612cdd565b612cac565b8082825260208201915060208360051b860101925085831115612d4757600080fd5b602085015b83811015611fcb578035835260209283019201612d4c565b60008060008060808587031215612d7a57600080fd5b612d8385612aa9565b9350602085013567ffffffffffffffff811115612d9f57600080fd5b8501601f81018713612db057600080fd5b8035612dbe612d2082612cdd565b8082825260208201915060208360051b850101925089831115612de057600080fd5b6020840193505b82841015612e0957612df884612aa9565b825260209384019390910190612de7565b9550505050604085013567ffffffffffffffff811115612e2857600080fd5b612e3487828801612d01565b925050606085013567ffffffffffffffff811115612e5157600080fd5b612e5d87828801612d01565b91505092959194509250565b60008083601f840112612e7b57600080fd5b50813567ffffffffffffffff811115612e9357600080fd5b6020830191508360208260051b8501011115612eae57600080fd5b9250929050565b60008060008060408587031215612ecb57600080fd5b843567ffffffffffffffff811115612ee257600080fd5b612eee87828801612e69565b909550935050602085013567ffffffffffffffff811115612f0e57600080fd5b612f1a87828801612e69565b95989497509550505050565b803560ff81168114612ac057600080fd5b60008060008060008060c08789031215612f5057600080fd5b612f5987612aa9565b95506020870135945060408701359350612f7560608801612f26565b9598949750929560808101359460a0909101359350915050565b600080600080600080600060e0888a031215612faa57600080fd5b612fb388612aa9565b9650612fc160208901612aa9565b95506040880135945060608801359350612fdd60808901612f26565b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561300d57600080fd5b61301683612aa9565b915061302460208401612aa9565b90509250929050565b6000806040838503121561304057600080fd5b61304983612aa9565b9150602083013563ffffffff81168114612b9d57600080fd5b600181811c9082168061307657607f821691505b602082108103611ff757634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b808201808211156106fc576106fc613096565b634e487b7160e01b600052603260045260246000fd5b6000602082840312156130e757600080fd5b815161098981612b63565b818103818111156106fc576106fc613096565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b634e487b7160e01b600052601260045260246000fd5b60008261318357634e487b7160e01b600052601260045260246000fd5b500490565b601f82111561234857806000526020600020601f840160051c810160208510156131af5750805b601f840160051c820191505b8181101561102a57600081556001016131bb565b815167ffffffffffffffff8111156131e9576131e9612c96565b6131fd816131f78454613062565b84613188565b6020601f82116001811461323157600083156132195750848201515b600019600385901b1c1916600184901b17845561102a565b600084815260208120601f198516915b828110156132615787850151825560209485019460019092019101613241565b508482101561327f5786840151600019600387901b60f8161c191681555b50505050600190811b01905550565b634e487b7160e01b600052602160045260246000fdfea2646970667358221220274d065de74f05d6c17e8d4ff5e09b91368cdffa3896ad11c7c347223e2ebe7b64736f6c634300081b0033", } // EigenABI is the input ABI used to generate the binding from. diff --git a/pkg/bindings/EigenPod/binding.go b/pkg/bindings/EigenPod/binding.go index 7016ff63f..32d0cd7a2 100644 --- a/pkg/bindings/EigenPod/binding.go +++ b/pkg/bindings/EigenPod/binding.go @@ -72,8 +72,8 @@ type IEigenPodValidatorInfo struct { // EigenPodMetaData contains all meta data concerning the EigenPod contract. var EigenPodMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_ethPOS\",\"type\":\"address\",\"internalType\":\"contractIETHPOSDeposit\"},{\"name\":\"_eigenPodManager\",\"type\":\"address\",\"internalType\":\"contractIEigenPodManager\"},{\"name\":\"_GENESIS_TIME\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"receive\",\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"GENESIS_TIME\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidatorCount\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"checkpointBalanceExitedGwei\",\"inputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"currentCheckpoint\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIEigenPod.Checkpoint\",\"components\":[{\"name\":\"beaconBlockRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proofsRemaining\",\"type\":\"uint24\",\"internalType\":\"uint24\"},{\"name\":\"podBalanceGwei\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"balanceDeltasGwei\",\"type\":\"int128\",\"internalType\":\"int128\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"currentCheckpointTimestamp\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"eigenPodManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigenPodManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ethPOS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIETHPOSDeposit\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getParentBlockRoot\",\"inputs\":[{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_podOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"lastCheckpointTimestamp\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"podOwner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proofSubmitter\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"recoverTokens\",\"inputs\":[{\"name\":\"tokenList\",\"type\":\"address[]\",\"internalType\":\"contractIERC20[]\"},{\"name\":\"amountsToWithdraw\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setProofSubmitter\",\"inputs\":[{\"name\":\"newProofSubmitter\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"stake\",\"inputs\":[{\"name\":\"pubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"depositDataRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"startCheckpoint\",\"inputs\":[{\"name\":\"revertIfNoBalance\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"validatorPubkeyHashToInfo\",\"inputs\":[{\"name\":\"validatorPubkeyHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIEigenPod.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\":\"enumIEigenPod.VALIDATOR_STATUS\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validatorPubkeyToInfo\",\"inputs\":[{\"name\":\"validatorPubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIEigenPod.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\":\"enumIEigenPod.VALIDATOR_STATUS\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validatorStatus\",\"inputs\":[{\"name\":\"validatorPubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPod.VALIDATOR_STATUS\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validatorStatus\",\"inputs\":[{\"name\":\"pubkeyHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPod.VALIDATOR_STATUS\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"verifyCheckpointProofs\",\"inputs\":[{\"name\":\"balanceContainerProof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.BalanceContainerProof\",\"components\":[{\"name\":\"balanceContainerRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"proofs\",\"type\":\"tuple[]\",\"internalType\":\"structBeaconChainProofs.BalanceProof[]\",\"components\":[{\"name\":\"pubkeyHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"balanceRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"verifyStaleBalance\",\"inputs\":[{\"name\":\"beaconTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"stateRootProof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.StateRootProof\",\"components\":[{\"name\":\"beaconStateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"proof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.ValidatorProof\",\"components\":[{\"name\":\"validatorFields\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"verifyWithdrawalCredentials\",\"inputs\":[{\"name\":\"beaconTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"stateRootProof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.StateRootProof\",\"components\":[{\"name\":\"beaconStateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"validatorIndices\",\"type\":\"uint40[]\",\"internalType\":\"uint40[]\"},{\"name\":\"validatorFieldsProofs\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"validatorFields\",\"type\":\"bytes32[][]\",\"internalType\":\"bytes32[][]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawRestakedBeaconChainETH\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amountWei\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawableRestakedExecutionLayerGwei\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"CheckpointCreated\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"beaconBlockRoot\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validatorCount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"CheckpointFinalized\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"totalShareDeltaWei\",\"type\":\"int256\",\"indexed\":false,\"internalType\":\"int256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"EigenPodStaked\",\"inputs\":[{\"name\":\"pubkey\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"NonBeaconChainETHReceived\",\"inputs\":[{\"name\":\"amountReceived\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ProofSubmitterUpdated\",\"inputs\":[{\"name\":\"prevProofSubmitter\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newProofSubmitter\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RestakedBeaconChainETHWithdrawn\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorBalanceUpdated\",\"inputs\":[{\"name\":\"validatorIndex\",\"type\":\"uint40\",\"indexed\":false,\"internalType\":\"uint40\"},{\"name\":\"balanceTimestamp\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"newValidatorBalanceGwei\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorCheckpointed\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorIndex\",\"type\":\"uint40\",\"indexed\":true,\"internalType\":\"uint40\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorRestaked\",\"inputs\":[{\"name\":\"validatorIndex\",\"type\":\"uint40\",\"indexed\":false,\"internalType\":\"uint40\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorWithdrawn\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorIndex\",\"type\":\"uint40\",\"indexed\":true,\"internalType\":\"uint40\"}],\"anonymous\":false}]", - Bin: "0x60e06040523480156200001157600080fd5b5060405162004ad038038062004ad0833981016040819052620000349162000142565b6001600160a01b03808416608052821660a0526001600160401b03811660c0526200005e62000067565b505050620001a1565b600054610100900460ff1615620000d45760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101562000127576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146200013f57600080fd5b50565b6000806000606084860312156200015857600080fd5b8351620001658162000129565b6020850151909350620001788162000129565b60408501519092506001600160401b03811681146200019657600080fd5b809150509250925092565b60805160a05160c0516148b26200021e60003960006105ff0152600081816102bd0152818161063a015281816106ec01528181610abf01528181610d6c015281816110f40152818161119c0152818161143c015281816118db01528181611a8401526131250152600081816104b8015261126701526148b26000f3fe60806040526004361061016a5760003560e01c80636fcd0e53116100d1578063c49074421161008a578063dda3346c11610064578063dda3346c1461058d578063ee94d67c146105ad578063f074ba62146105cd578063f2882461146105ed57600080fd5b8063c49074421461052d578063c4d66de81461054d578063d06d55871461056d57600080fd5b80636fcd0e53146104425780637439841f1461046f57806374cdd798146104a657806388676cad146104da5780639b4e4634146104fa578063b522538a1461050d57600080fd5b80634665bcda116101235780634665bcda146102ab57806347d28372146102df57806352396a591461039f57806358753357146103d557806358eaee79146103f55780636c0d2d5a1461042257600080fd5b8063039157d2146101a95780630b18ff66146101cb5780632340e8d3146102085780633474aa161461022c5780633f65cf191461026457806342ecff2a1461028457600080fd5b366101a4576040513481527f6fdd3dbdb173299608c0aa9f368735857c8842b581f8389238bf05bd04b3bf499060200160405180910390a1005b600080fd5b3480156101b557600080fd5b506101c96101c4366004613b66565b610621565b005b3480156101d757600080fd5b506033546101eb906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561021457600080fd5b5061021e60395481565b6040519081526020016101ff565b34801561023857600080fd5b5060345461024c906001600160401b031681565b6040516001600160401b0390911681526020016101ff565b34801561027057600080fd5b506101c961027f366004613c24565b610a67565b34801561029057600080fd5b50603a5461024c90600160401b90046001600160401b031681565b3480156102b757600080fd5b506101eb7f000000000000000000000000000000000000000000000000000000000000000081565b3480156102eb57600080fd5b5061035b6040805160808101825260008082526020820181905291810182905260608101919091525060408051608081018252603c548152603d5462ffffff811660208301526001600160401b03630100000082041692820192909252600160581b909104600f0b606082015290565b6040516101ff91908151815260208083015162ffffff16908201526040808301516001600160401b031690820152606091820151600f0b9181019190915260800190565b3480156103ab57600080fd5b5061024c6103ba366004613cf2565b603b602052600090815260409020546001600160401b031681565b3480156103e157600080fd5b50603e546101eb906001600160a01b031681565b34801561040157600080fd5b50610415610410366004613d4e565b610dd6565b6040516101ff9190613dc7565b34801561042e57600080fd5b5061021e61043d366004613cf2565b610e3b565b34801561044e57600080fd5b5061046261045d366004613dd5565b610fef565b6040516101ff9190613dee565b34801561047b57600080fd5b5061041561048a366004613dd5565b600090815260366020526040902054600160c01b900460ff1690565b3480156104b257600080fd5b506101eb7f000000000000000000000000000000000000000000000000000000000000000081565b3480156104e657600080fd5b506101c96104f5366004613e44565b61109c565b6101c9610508366004613e61565b611191565b34801561051957600080fd5b50610462610528366004613d4e565b61133e565b34801561053957600080fd5b506101c9610548366004613ef4565b611431565b34801561055957600080fd5b506101c9610568366004613f20565b61166e565b34801561057957600080fd5b506101c9610588366004613f20565b611805565b34801561059957600080fd5b506101c96105a8366004614011565b611898565b3480156105b957600080fd5b50603a5461024c906001600160401b031681565b3480156105d957600080fd5b506101c96105e83660046140e2565b611a6b565b3480156105f957600080fd5b5061024c7f000000000000000000000000000000000000000000000000000000000000000081565b604051635ac86ab760e01b8152600660048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa158015610689573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106ad919061414a565b156106d35760405162461bcd60e51b81526004016106ca90614167565b60405180910390fd5b604051635ac86ab760e01b8152600860048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa15801561073b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061075f919061414a565b1561077c5760405162461bcd60e51b81526004016106ca90614167565b60006107c261078b85806141c4565b80806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250611ebe92505050565b6000818152603660209081526040808320815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b8104909416928101929092529394509192906060830190600160c01b900460ff16600281111561083157610831613d8f565b600281111561084257610842613d8f565b81525050905080604001516001600160401b0316876001600160401b0316116108d5576040805162461bcd60e51b81526020600482015260248101919091527f456967656e506f642e7665726966795374616c6542616c616e63653a2070726f60448201527f6f66206973206f6c646572207468616e206c61737420636865636b706f696e7460648201526084016106ca565b6001816060015160028111156108ed576108ed613d8f565b146109575760405162461bcd60e51b815260206004820152603460248201527f456967656e506f642e7665726966795374616c6542616c616e63653a2076616c604482015273696461746f72206973206e6f742061637469766560601b60648201526084016106ca565b61099b61096486806141c4565b80806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250611ee292505050565b610a1f5760405162461bcd60e51b815260206004820152604960248201527f456967656e506f642e7665726966795374616c6542616c616e63653a2076616c60448201527f696461746f72206d75737420626520736c617368656420746f206265206d61726064820152686b6564207374616c6560b81b608482015260a4016106ca565b610a31610a2b88610e3b565b87611f0c565b610a548635610a4087806141c4565b610a4d60208a018a61420d565b8651612067565b610a5e600061227e565b50505050505050565b6033546001600160a01b0316331480610a8a5750603e546001600160a01b031633145b610aa65760405162461bcd60e51b81526004016106ca90614253565b604051635ac86ab760e01b8152600260048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa158015610b0e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b32919061414a565b15610b4f5760405162461bcd60e51b81526004016106ca90614167565b8584148015610b5d57508382145b610bed5760405162461bcd60e51b815260206004820152605560248201527f456967656e506f642e7665726966795769746864726177616c43726564656e7460448201527f69616c733a2076616c696461746f72496e646963657320616e642070726f6f666064820152740e640daeae6e840c4ca40e6c2daca40d8cadccee8d605b1b608482015260a4016106ca565b603a546001600160401b03600160401b9091048116908a1611610c8d5760405162461bcd60e51b815260206004820152604c60248201527f456967656e506f642e7665726966795769746864726177616c43726564656e7460448201527f69616c733a207370656369666965642074696d657374616d7020697320746f6f60648201526b0819985c881a5b881c185cdd60a21b608482015260a4016106ca565b610c9f610c998a610e3b565b89611f0c565b6000805b87811015610d4257610d248a358a8a84818110610cc257610cc26142c7565b9050602002016020810190610cd791906142dd565b898985818110610ce957610ce96142c7565b9050602002810190610cfb919061420d565b898987818110610d0d57610d0d6142c7565b9050602002810190610d1f91906141c4565b612514565b610d2e908361431a565b915080610d3a81614332565b915050610ca3565b5060335460405163030b147160e61b81526001600160a01b039182166004820152602481018390527f00000000000000000000000000000000000000000000000000000000000000009091169063c2c51c4090604401600060405180830381600087803b158015610db257600080fd5b505af1158015610dc6573d6000803e3d6000fd5b5050505050505050505050505050565b600080610e1884848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612afa92505050565b600090815260366020526040902054600160c01b900460ff169150505b92915050565b6000610e4a611fff600c61434d565b610e5d6001600160401b0384164261436c565b10610ec65760405162461bcd60e51b815260206004820152603360248201527f456967656e506f642e676574506172656e74426c6f636b526f6f743a2074696d604482015272657374616d70206f7574206f662072616e676560681b60648201526084016106ca565b604080516001600160401b03841660208201526000918291720f3df6d732807ef1319fb7b8bb8522d0beac02910160408051601f1981840301815290829052610f0e916143b3565b600060405180830381855afa9150503d8060008114610f49576040519150601f19603f3d011682016040523d82523d6000602084013e610f4e565b606091505b5091509150818015610f61575060008151115b610fd35760405162461bcd60e51b815260206004820152603860248201527f456967656e506f642e676574506172656e74426c6f636b526f6f743a20696e7660448201527f616c696420626c6f636b20726f6f742072657475726e6564000000000000000060648201526084016106ca565b80806020019051810190610fe791906143cf565b949350505050565b6110176040805160808101825260008082526020820181905291810182905290606082015290565b600082815260366020908152604091829020825160808101845281546001600160401b038082168352600160401b8204811694830194909452600160801b810490931693810193909352906060830190600160c01b900460ff16600281111561108257611082613d8f565b600281111561109357611093613d8f565b90525092915050565b6033546001600160a01b03163314806110bf5750603e546001600160a01b031633145b6110db5760405162461bcd60e51b81526004016106ca90614253565b604051635ac86ab760e01b8152600660048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa158015611143573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611167919061414a565b156111845760405162461bcd60e51b81526004016106ca90614167565b61118d8261227e565b5050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146111d95760405162461bcd60e51b81526004016106ca906143e8565b346801bc16d674ec800000146112655760405162461bcd60e51b8152602060048201526044602482018190527f456967656e506f642e7374616b653a206d75737420696e697469616c6c792073908201527f74616b6520666f7220616e792076616c696461746f72207769746820333220656064820152633a3432b960e11b608482015260a4016106ca565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663228951186801bc16d674ec80000087876112a8612bf4565b8888886040518863ffffffff1660e01b81526004016112cc9695949392919061448e565b6000604051808303818588803b1580156112e557600080fd5b505af11580156112f9573d6000803e3d6000fd5b50505050507f606865b7934a25d4aed43f6cdb426403353fa4b3009c4d228407474581b01e23858560405161132f9291906144dd565b60405180910390a15050505050565b6113666040805160808101825260008082526020820181905291810182905290606082015290565b603660006113a985858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612afa92505050565b81526020808201929092526040908101600020815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b81049094169281019290925290916060830190600160c01b900460ff16600281111561141657611416613d8f565b600281111561142757611427613d8f565b9052509392505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146114795760405162461bcd60e51b81526004016106ca906143e8565b611487633b9aca0082614507565b156115115760405162461bcd60e51b815260206004820152604e60248201527f456967656e506f642e776974686472617752657374616b6564426561636f6e4360448201527f6861696e4554483a20616d6f756e74576569206d75737420626520612077686f60648201526d1b194811ddd95a48185b5bdd5b9d60921b608482015260a4016106ca565b6000611521633b9aca008361451b565b6034549091506001600160401b0390811690821611156115da5760405162461bcd60e51b815260206004820152606260248201527f456967656e506f642e776974686472617752657374616b6564426561636f6e4360448201527f6861696e4554483a20616d6f756e74477765692065786365656473207769746860648201527f6472617761626c6552657374616b6564457865637574696f6e4c617965724777608482015261656960f01b60a482015260c4016106ca565b603480548291906000906115f89084906001600160401b031661452f565b92506101000a8154816001600160401b0302191690836001600160401b03160217905550826001600160a01b03167f8947fd2ce07ef9cc302c4e8f0461015615d91ce851564839e91cc804c2f49d8e8360405161165791815260200190565b60405180910390a26116698383612c39565b505050565b600054610100900460ff161580801561168e5750600054600160ff909116105b806116a85750303b1580156116a8575060005460ff166001145b61170b5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016106ca565b6000805460ff19166001179055801561172e576000805461ff0019166101001790555b6001600160a01b0382166117a15760405162461bcd60e51b815260206004820152603460248201527f456967656e506f642e696e697469616c697a653a20706f644f776e65722063616044820152736e6e6f74206265207a65726f206164647265737360601b60648201526084016106ca565b603380546001600160a01b0319166001600160a01b038416179055801561118d576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050565b6033546001600160a01b0316331461182f5760405162461bcd60e51b81526004016106ca90614557565b603e54604080516001600160a01b03928316815291831660208301527ffb8129080a19d34dceac04ba253fc50304dc86c729bd63cdca4a969ad19a5eac910160405180910390a1603e80546001600160a01b0319166001600160a01b0392909216919091179055565b6033546001600160a01b031633146118c25760405162461bcd60e51b81526004016106ca90614557565b604051635ac86ab760e01b8152600560048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa15801561192a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061194e919061414a565b1561196b5760405162461bcd60e51b81526004016106ca90614167565b82518451146119f65760405162461bcd60e51b815260206004820152604b60248201527f456967656e506f642e7265636f766572546f6b656e733a20746f6b656e4c697360448201527f7420616e6420616d6f756e7473546f5769746864726177206d7573742062652060648201526a0e6c2daca40d8cadccee8d60ab1b608482015260a4016106ca565b60005b8451811015611a6457611a5283858381518110611a1857611a186142c7565b6020026020010151878481518110611a3257611a326142c7565b60200260200101516001600160a01b0316612d529092919063ffffffff16565b80611a5c81614332565b9150506119f9565b5050505050565b604051635ac86ab760e01b8152600760048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa158015611ad3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611af7919061414a565b15611b145760405162461bcd60e51b81526004016106ca90614167565b603a54600160401b90046001600160401b031680611bc05760405162461bcd60e51b815260206004820152605860248201527f456967656e506f642e766572696679436865636b706f696e7450726f6f66733a60448201527f206d75737420686176652061637469766520636865636b706f696e7420746f2060648201527f706572666f726d20636865636b706f696e742070726f6f660000000000000000608482015260a4016106ca565b60408051608081018252603c54808252603d5462ffffff811660208401526001600160401b03630100000082041693830193909352600160581b909204600f0b606082015290611c109087612da4565b6000805b85811015611e645736878783818110611c2f57611c2f6142c7565b9050602002810190611c41919061459f565b80356000908152603660209081526040808320815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b8104909416928101929092529394509192906060830190600160c01b900460ff166002811115611cb257611cb2613d8f565b6002811115611cc357611cc3613d8f565b9052509050600181606001516002811115611ce057611ce0613d8f565b14611cec575050611e52565b856001600160401b031681604001516001600160401b031610611d10575050611e52565b600080611d2083898e3587612f20565b602089018051929450909250611d35826145b5565b62ffffff16905250606087018051839190611d519083906145d4565b600f0b905250611d618187614623565b84356000908152603660209081526040918290208651815492880151938801516001600160401b03908116600160801b0267ffffffffffffffff60801b19958216600160401b026001600160801b0319909516919092161792909217928316821781556060870151939950869390929091839160ff60c01b1990911668ffffffffffffffffff60801b1990911617600160c01b836002811115611e0657611e06613d8f565b021790555050835160405164ffffffffff90911691506001600160401b038a16907fa91c59033c3423e18b54d0acecebb4972f9ea95aedf5f4cae3b677b02eaf3a3f90600090a3505050505b80611e5c81614332565b915050611c14565b506001600160401b038084166000908152603b6020526040812080548493919291611e9191859116614623565b92506101000a8154816001600160401b0302191690836001600160401b03160217905550610a5e82613042565b600081600081518110611ed357611ed36142c7565b60200260200101519050919050565b600081600381518110611ef757611ef76142c7565b60200260200101516000801b14159050919050565b611f186003602061434d565b611f25602083018361420d565b905014611f9a5760405162461bcd60e51b815260206004820152603d60248201527f426561636f6e436861696e50726f6f66732e7665726966795374617465526f6f60448201527f743a2050726f6f662068617320696e636f7272656374206c656e67746800000060648201526084016106ca565b611fea611faa602083018361420d565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525086925050843590506003613249565b61118d5760405162461bcd60e51b815260206004820152604260248201527f426561636f6e436861696e50726f6f66732e7665726966795374617465526f6f60448201527f743a20496e76616c696420737461746520726f6f74206d65726b6c652070726f60648201526137b360f11b608482015260a4016106ca565b600884146120e25760405162461bcd60e51b815260206004820152604e602482015260008051602061485d83398151915260448201527f724669656c64733a2056616c696461746f72206669656c64732068617320696e60648201526d0c6dee4e4cac6e840d8cadccee8d60931b608482015260a4016106ca565b60056120f06028600161431a565b6120fa919061431a565b61210590602061434d565b82146121735760405162461bcd60e51b8152602060048201526043602482015260008051602061485d83398151915260448201527f724669656c64733a2050726f6f662068617320696e636f7272656374206c656e6064820152620cee8d60eb1b608482015260a4016106ca565b60006121b186868080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061326192505050565b9050600064ffffffffff83166121c96028600161431a565b600b901b17905061221485858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508c9250869150859050613249565b6122745760405162461bcd60e51b815260206004820152603d602482015260008051602061485d83398151915260448201527f724669656c64733a20496e76616c6964206d65726b6c652070726f6f6600000060648201526084016106ca565b5050505050505050565b603a54600160401b90046001600160401b03161561231f5760405162461bcd60e51b815260206004820152605260248201527f456967656e506f642e5f7374617274436865636b706f696e743a206d7573742060448201527f66696e6973682070726576696f757320636865636b706f696e74206265666f72606482015271329039ba30b93a34b7339030b737ba3432b960711b608482015260a4016106ca565b603a54426001600160401b03908116911614156123a45760405162461bcd60e51b815260206004820152603f60248201527f456967656e506f642e5f7374617274436865636b706f696e743a2063616e6e6f60448201527f7420636865636b706f696e7420747769636520696e206f6e6520626c6f636b0060648201526084016106ca565b6034546000906001600160401b03166123c1633b9aca004761451b565b6123cb919061452f565b90508180156123e157506001600160401b038116155b156124545760405162461bcd60e51b815260206004820152603d60248201527f456967656e506f642e5f7374617274436865636b706f696e743a206e6f20626160448201527f6c616e636520617661696c61626c6520746f20636865636b706f696e7400000060648201526084016106ca565b6000604051806080016040528061246a42610e3b565b815260200160395462ffffff168152602001836001600160401b031681526020016000600f0b815250905042603a60086101000a8154816001600160401b0302191690836001600160401b031602179055506124c581613042565b805160208083015160405162ffffff90911681526001600160401b034216917f575796133bbed337e5b39aa49a30dc2556a91e0c6c2af4b7b886ae77ebef1076910160405180910390a3505050565b600080612553848480806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250611ebe92505050565b6000818152603660209081526040808320815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b8104909416928101929092529394509192906060830190600160c01b900460ff1660028111156125c2576125c2613d8f565b60028111156125d3576125d3613d8f565b90525090506000816060015160028111156125f0576125f0613d8f565b146126815760405162461bcd60e51b8152602060048201526061602482015260008051602061483d83398151915260448201527f7469616c733a2076616c696461746f72206d75737420626520696e616374697660648201527f6520746f2070726f7665207769746864726177616c2063726564656e7469616c6084820152607360f81b60a482015260c4016106ca565b6001600160401b0380166126c786868080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061350e92505050565b6001600160401b031614156127505760405162461bcd60e51b8152602060048201526055602482015260008051602061483d83398151915260448201527f7469616c733a2076616c696461746f72206d75737420626520696e207468652060648201527470726f63657373206f662061637469766174696e6760581b608482015260a4016106ca565b6001600160401b03801661279686868080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061353392505050565b6001600160401b03161461280e5760405162461bcd60e51b81526020600482015260446024820181905260008051602061483d833981519152908201527f7469616c733a2076616c696461746f72206d757374206e6f742062652065786960648201526374696e6760e01b608482015260a4016106ca565b612816612bf4565b61281f9061464e565b61285b86868080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061354b92505050565b146128ca5760405162461bcd60e51b8152602060048201526045602482015260008051602061483d83398151915260448201527f7469616c733a2070726f6f66206973206e6f7420666f72207468697320456967606482015264195b941bd960da1b608482015260a4016106ca565b600061290886868080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061356092505050565b90506129188a87878b8b8e612067565b6039805490600061292883614332565b9091555050603a54600090600160401b90046001600160401b03161561296057603a54600160401b90046001600160401b031661296d565b603a546001600160401b03165b6040805160808101825264ffffffffff8d1681526001600160401b03858116602083015283169181019190915290915060608101600190526000858152603660209081526040918290208351815492850151938501516001600160401b03908116600160801b0267ffffffffffffffff60801b19958216600160401b026001600160801b031990951691909216179290921792831682178155606084015190929091839160ff60c01b1990911668ffffffffffffffffff60801b1990911617600160c01b836002811115612a4357612a43613d8f565b02179055505060405164ffffffffff8c1681527f2d0800bbc377ea54a08c5db6a87aafff5e3e9c8fead0eda110e40e0c10441449915060200160405180910390a16040805164ffffffffff8c1681526001600160401b03838116602083015284168183015290517f0e5fac175b83177cc047381e030d8fb3b42b37bd1c025e22c280facad62c32df9181900360600190a1612aeb633b9aca006001600160401b03841661434d565b9b9a5050505050505050505050565b60008151603014612b835760405162461bcd60e51b815260206004820152604760248201527f456967656e506f642e5f63616c63756c61746556616c696461746f725075626b60448201527f657948617368206d75737420626520612034382d6279746520424c53207075626064820152666c6963206b657960c81b608482015260a4016106ca565b604051600290612b9a908490600090602001614672565b60408051601f1981840301815290829052612bb4916143b3565b602060405180830381855afa158015612bd1573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190610e3591906143cf565b60408051600160f81b60208201526000602182015230606090811b6bffffffffffffffffffffffff1916602c8301529101604051602081830303815290604052905090565b80471015612c895760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e636500000060448201526064016106ca565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114612cd6576040519150601f19603f3d011682016040523d82523d6000602084013e612cdb565b606091505b50509050806116695760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d6179206861766520726576657274656400000000000060648201526084016106ca565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052611669908490613578565b612db06005600361431a565b612dbb90602061434d565b612dc8602083018361420d565b905014612e4b5760405162461bcd60e51b8152602060048201526044602482018190527f426561636f6e436861696e50726f6f66732e76657269667942616c616e636543908201527f6f6e7461696e65723a2050726f6f662068617320696e636f7272656374206c656064820152630dccee8d60e31b608482015260a4016106ca565b606c612e9c612e5d602084018461420d565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250879250508535905084613249565b6116695760405162461bcd60e51b815260206004820152604960248201527f426561636f6e436861696e50726f6f66732e76657269667942616c616e63654360448201527f6f6e7461696e65723a20696e76616c69642062616c616e636520636f6e7461696064820152683732b910383937b7b360b91b608482015260a4016106ca565b83516020850151600091829182612f3887848861364a565b9050816001600160401b0316816001600160401b031614612fb257612f5d81836137c1565b6040805164ffffffffff861681526001600160401b038b8116602083015284168183015290519196507f0e5fac175b83177cc047381e030d8fb3b42b37bd1c025e22c280facad62c32df919081900360600190a15b6001600160401b0380821660208b0181905290891660408b01526130365760398054906000612fe0836146a1565b9091555050600260608a0152612ff5856146b8565b93508264ffffffffff16886001600160401b03167f2a02361ffa66cf2c2da4682c2355a6adcaa9f6c227b6e6563e68480f9587626a60405160405180910390a35b50505094509492505050565b602081015162ffffff166131c9576000633b9aca00826060015183604001516001600160401b031661307491906145d4565b600f0b61308191906146df565b60408301516034805492935090916000906130a69084906001600160401b0316614623565b82546101009290920a6001600160401b03818102199093169183160217909155603a8054600160401b81049092166001600160801b0319909216919091179055506000603c55603d80546001600160d81b031916905560335460405163030b147160e61b81526001600160a01b039182166004820152602481018390527f00000000000000000000000000000000000000000000000000000000000000009091169063c2c51c4090604401600060405180830381600087803b15801561316b57600080fd5b505af115801561317f573d6000803e3d6000fd5b5050603a546040518481526001600160401b0390911692507f525408c201bc1576eb44116f6478f1c2a54775b19a043bcfdc708364f74f8e44915060200160405180910390a25050565b8051603c556020810151603d8054604084015160608501516fffffffffffffffffffffffffffffffff16600160581b026fffffffffffffffffffffffffffffffff60581b196001600160401b039092166301000000026affffffffffffffffffffff1990931662ffffff9095169490941791909117169190911790555b50565b6000836132578685856137d9565b1495945050505050565b60008060028351613272919061451b565b90506000816001600160401b0381111561328e5761328e613f3d565b6040519080825280602002602001820160405280156132b7578160200160208202803683370190505b50905060005b828110156133be576002856132d2838361434d565b815181106132e2576132e26142c7565b6020026020010151868360026132f8919061434d565b61330390600161431a565b81518110613313576133136142c7565b6020026020010151604051602001613335929190918252602082015260400190565b60408051601f198184030181529082905261334f916143b3565b602060405180830381855afa15801561336c573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061338f91906143cf565b8282815181106133a1576133a16142c7565b6020908102919091010152806133b681614332565b9150506132bd565b506133ca60028361451b565b91505b81156134ea5760005b828110156134d7576002826133eb838361434d565b815181106133fb576133fb6142c7565b602002602001015183836002613411919061434d565b61341c90600161431a565b8151811061342c5761342c6142c7565b602002602001015160405160200161344e929190918252602082015260400190565b60408051601f1981840301815290829052613468916143b3565b602060405180830381855afa158015613485573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906134a891906143cf565b8282815181106134ba576134ba6142c7565b6020908102919091010152806134cf81614332565b9150506133d6565b506134e360028361451b565b91506133cd565b806000815181106134fd576134fd6142c7565b602002602001015192505050919050565b6000610e3582600581518110613526576135266142c7565b6020026020010151613925565b6000610e3582600681518110613526576135266142c7565b600081600181518110611ed357611ed36142c7565b6000610e3582600281518110613526576135266142c7565b60006135cd826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661398c9092919063ffffffff16565b80519091501561166957808060200190518101906135eb919061414a565b6116695760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016106ca565b60006136586026600161431a565b61366390602061434d565b613670604084018461420d565b9050146136e15760405162461bcd60e51b81526020600482015260446024820181905260008051602061485d833981519152908201527f7242616c616e63653a2050726f6f662068617320696e636f7272656374206c656064820152630dccee8d60e31b608482015260a4016106ca565b60006136ee600485614764565b64ffffffffff169050613748613707604085018561420d565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508992505050602086013584613249565b6137a85760405162461bcd60e51b815260206004820152603e602482015260008051602061485d83398151915260448201527f7242616c616e63653a20496e76616c6964206d65726b6c652070726f6f66000060648201526084016106ca565b6137b683602001358561399b565b9150505b9392505050565b60006137ba6001600160401b03808416908516614788565b600083516000141580156137f85750602084516137f69190614507565b155b6138875760405162461bcd60e51b815260206004820152605460248201527f4d65726b6c652e70726f63657373496e636c7573696f6e50726f6f665368613260448201527f35363a2070726f6f66206c656e6774682073686f756c642062652061206e6f6e60648201527316bd32b9379036bab63a34b836329037b310199960611b608482015260a4016106ca565b604080516020808201909252848152905b8551811161391b576138ab600285614507565b6138de578151600052808601516020526020826040600060026107d05a03fa6138d357600080fd5b600284049350613909565b8086015160005281516020526020826040600060026107d05a03fa61390257600080fd5b6002840493505b61391460208261431a565b9050613898565b5051949350505050565b60f881901c60e882901c61ff00161760d882901c62ff0000161760c882901c63ff000000161764ff0000000060b883901c161765ff000000000060a883901c161766ff000000000000609883901c161767ff0000000000000060889290921c919091161790565b6060610fe784846000856139c8565b6000806139a96004846147d8565b6139b49060406147fc565b64ffffffffff169050610fe784821b613925565b606082471015613a295760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016106ca565b6001600160a01b0385163b613a805760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016106ca565b600080866001600160a01b03168587604051613a9c91906143b3565b60006040518083038185875af1925050503d8060008114613ad9576040519150601f19603f3d011682016040523d82523d6000602084013e613ade565b606091505b5091509150613aee828286613af9565b979650505050505050565b60608315613b085750816137ba565b825115613b185782518084602001fd5b8160405162461bcd60e51b81526004016106ca9190614829565b80356001600160401b0381168114613b4957600080fd5b919050565b600060408284031215613b6057600080fd5b50919050565b600080600060608486031215613b7b57600080fd5b613b8484613b32565b925060208401356001600160401b0380821115613ba057600080fd5b613bac87838801613b4e565b93506040860135915080821115613bc257600080fd5b50613bcf86828701613b4e565b9150509250925092565b60008083601f840112613beb57600080fd5b5081356001600160401b03811115613c0257600080fd5b6020830191508360208260051b8501011115613c1d57600080fd5b9250929050565b60008060008060008060008060a0898b031215613c4057600080fd5b613c4989613b32565b975060208901356001600160401b0380821115613c6557600080fd5b613c718c838d01613b4e565b985060408b0135915080821115613c8757600080fd5b613c938c838d01613bd9565b909850965060608b0135915080821115613cac57600080fd5b613cb88c838d01613bd9565b909650945060808b0135915080821115613cd157600080fd5b50613cde8b828c01613bd9565b999c989b5096995094979396929594505050565b600060208284031215613d0457600080fd5b6137ba82613b32565b60008083601f840112613d1f57600080fd5b5081356001600160401b03811115613d3657600080fd5b602083019150836020828501011115613c1d57600080fd5b60008060208385031215613d6157600080fd5b82356001600160401b03811115613d7757600080fd5b613d8385828601613d0d565b90969095509350505050565b634e487b7160e01b600052602160045260246000fd5b60038110613dc357634e487b7160e01b600052602160045260246000fd5b9052565b60208101610e358284613da5565b600060208284031215613de757600080fd5b5035919050565b60006080820190506001600160401b03808451168352806020850151166020840152806040850151166040840152506060830151613e2f6060840182613da5565b5092915050565b801515811461324657600080fd5b600060208284031215613e5657600080fd5b81356137ba81613e36565b600080600080600060608688031215613e7957600080fd5b85356001600160401b0380821115613e9057600080fd5b613e9c89838a01613d0d565b90975095506020880135915080821115613eb557600080fd5b50613ec288828901613d0d565b96999598509660400135949350505050565b6001600160a01b038116811461324657600080fd5b8035613b4981613ed4565b60008060408385031215613f0757600080fd5b8235613f1281613ed4565b946020939093013593505050565b600060208284031215613f3257600080fd5b81356137ba81613ed4565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715613f7b57613f7b613f3d565b604052919050565b60006001600160401b03821115613f9c57613f9c613f3d565b5060051b60200190565b600082601f830112613fb757600080fd5b81356020613fcc613fc783613f83565b613f53565b82815260059290921b84018101918181019086841115613feb57600080fd5b8286015b848110156140065780358352918301918301613fef565b509695505050505050565b60008060006060848603121561402657600080fd5b83356001600160401b038082111561403d57600080fd5b818601915086601f83011261405157600080fd5b81356020614061613fc783613f83565b82815260059290921b8401810191818101908a84111561408057600080fd5b948201945b838610156140a757853561409881613ed4565b82529482019490820190614085565b975050870135925050808211156140bd57600080fd5b506140ca86828701613fa6565b9250506140d960408501613ee9565b90509250925092565b6000806000604084860312156140f757600080fd5b83356001600160401b038082111561410e57600080fd5b61411a87838801613b4e565b9450602086013591508082111561413057600080fd5b5061413d86828701613bd9565b9497909650939450505050565b60006020828403121561415c57600080fd5b81516137ba81613e36565b6020808252603e908201527f456967656e506f642e6f6e6c795768656e4e6f745061757365643a20696e646560408201527f782069732070617573656420696e20456967656e506f644d616e616765720000606082015260800190565b6000808335601e198436030181126141db57600080fd5b8301803591506001600160401b038211156141f557600080fd5b6020019150600581901b3603821315613c1d57600080fd5b6000808335601e1984360301811261422457600080fd5b8301803591506001600160401b0382111561423e57600080fd5b602001915036819003821315613c1d57600080fd5b6020808252604e908201527f456967656e506f642e6f6e6c794f776e65724f7250726f6f665375626d69747460408201527f65723a2063616c6c6572206973206e6f7420706f64206f776e6572206f72207060608201526d3937b7b31039bab136b4ba3a32b960911b608082015260a00190565b634e487b7160e01b600052603260045260246000fd5b6000602082840312156142ef57600080fd5b813564ffffffffff811681146137ba57600080fd5b634e487b7160e01b600052601160045260246000fd5b6000821982111561432d5761432d614304565b500190565b600060001982141561434657614346614304565b5060010190565b600081600019048311821515161561436757614367614304565b500290565b60008282101561437e5761437e614304565b500390565b60005b8381101561439e578181015183820152602001614386565b838111156143ad576000848401525b50505050565b600082516143c5818460208701614383565b9190910192915050565b6000602082840312156143e157600080fd5b5051919050565b60208082526031908201527f456967656e506f642e6f6e6c79456967656e506f644d616e616765723a206e6f6040820152703a1032b4b3b2b72837b226b0b730b3b2b960791b606082015260800190565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6000815180845261447a816020860160208601614383565b601f01601f19169290920160200192915050565b6080815260006144a260808301888a614439565b82810360208401526144b48188614462565b905082810360408401526144c9818688614439565b915050826060830152979650505050505050565b602081526000610fe7602083018486614439565b634e487b7160e01b600052601260045260246000fd5b600082614516576145166144f1565b500690565b60008261452a5761452a6144f1565b500490565b60006001600160401b038381169083168181101561454f5761454f614304565b039392505050565b60208082526028908201527f456967656e506f642e6f6e6c79456967656e506f644f776e65723a206e6f74206040820152673837b227bbb732b960c11b606082015260800190565b60008235605e198336030181126143c557600080fd5b600062ffffff8216806145ca576145ca614304565b6000190192915050565b600081600f0b83600f0b600082128260016001607f1b03038213811516156145fe576145fe614304565b8260016001607f1b031903821281161561461a5761461a614304565b50019392505050565b60006001600160401b0380831681851680830382111561464557614645614304565b01949350505050565b80516020808301519190811015613b605760001960209190910360031b1b16919050565b60008351614684818460208801614383565b6001600160801b0319939093169190920190815260100192915050565b6000816146b0576146b0614304565b506000190190565b600081600f0b60016001607f1b03198114156146d6576146d6614304565b60000392915050565b60006001600160ff1b038184138284138082168684048611161561470557614705614304565b600160ff1b600087128281168783058912161561472457614724614304565b6000871292508782058712848416161561474057614740614304565b8785058712818416161561475657614756614304565b505050929093029392505050565b600064ffffffffff8084168061477c5761477c6144f1565b92169190910492915050565b600081600f0b83600f0b600081128160016001607f1b0319018312811516156147b3576147b3614304565b8160016001607f1b030183138116156147ce576147ce614304565b5090039392505050565b600064ffffffffff808416806147f0576147f06144f1565b92169190910692915050565b600064ffffffffff8083168185168183048111821515161561482057614820614304565b02949350505050565b6020815260006137ba602083018461446256fe456967656e506f642e5f7665726966795769746864726177616c43726564656e426561636f6e436861696e50726f6f66732e76657269667956616c696461746fa2646970667358221220721ae261e7ea8172633ca39b5c47509345abd9d23c9a1d07374863ca537d102264736f6c634300080c0033", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_ethPOS\",\"type\":\"address\",\"internalType\":\"contractIETHPOSDeposit\"},{\"name\":\"_eigenPodManager\",\"type\":\"address\",\"internalType\":\"contractIEigenPodManager\"},{\"name\":\"_GENESIS_TIME\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"receive\",\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"GENESIS_TIME\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidatorCount\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"checkpointBalanceExitedGwei\",\"inputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"currentCheckpoint\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIEigenPod.Checkpoint\",\"components\":[{\"name\":\"beaconBlockRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proofsRemaining\",\"type\":\"uint24\",\"internalType\":\"uint24\"},{\"name\":\"podBalanceGwei\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"balanceDeltasGwei\",\"type\":\"int128\",\"internalType\":\"int128\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"currentCheckpointTimestamp\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"eigenPodManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigenPodManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ethPOS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIETHPOSDeposit\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getParentBlockRoot\",\"inputs\":[{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_podOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"lastCheckpointTimestamp\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"podOwner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proofSubmitter\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"recoverTokens\",\"inputs\":[{\"name\":\"tokenList\",\"type\":\"address[]\",\"internalType\":\"contractIERC20[]\"},{\"name\":\"amountsToWithdraw\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setProofSubmitter\",\"inputs\":[{\"name\":\"newProofSubmitter\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"stake\",\"inputs\":[{\"name\":\"pubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"depositDataRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"startCheckpoint\",\"inputs\":[{\"name\":\"revertIfNoBalance\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"validatorPubkeyHashToInfo\",\"inputs\":[{\"name\":\"validatorPubkeyHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIEigenPod.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\":\"enumIEigenPod.VALIDATOR_STATUS\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validatorPubkeyToInfo\",\"inputs\":[{\"name\":\"validatorPubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIEigenPod.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\":\"enumIEigenPod.VALIDATOR_STATUS\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validatorStatus\",\"inputs\":[{\"name\":\"validatorPubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPod.VALIDATOR_STATUS\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validatorStatus\",\"inputs\":[{\"name\":\"pubkeyHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPod.VALIDATOR_STATUS\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"verifyCheckpointProofs\",\"inputs\":[{\"name\":\"balanceContainerProof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.BalanceContainerProof\",\"components\":[{\"name\":\"balanceContainerRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"proofs\",\"type\":\"tuple[]\",\"internalType\":\"structBeaconChainProofs.BalanceProof[]\",\"components\":[{\"name\":\"pubkeyHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"balanceRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"verifyStaleBalance\",\"inputs\":[{\"name\":\"beaconTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"stateRootProof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.StateRootProof\",\"components\":[{\"name\":\"beaconStateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"proof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.ValidatorProof\",\"components\":[{\"name\":\"validatorFields\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"verifyWithdrawalCredentials\",\"inputs\":[{\"name\":\"beaconTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"stateRootProof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.StateRootProof\",\"components\":[{\"name\":\"beaconStateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"validatorIndices\",\"type\":\"uint40[]\",\"internalType\":\"uint40[]\"},{\"name\":\"validatorFieldsProofs\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"validatorFields\",\"type\":\"bytes32[][]\",\"internalType\":\"bytes32[][]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawRestakedBeaconChainETH\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amountWei\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawableRestakedExecutionLayerGwei\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"CheckpointCreated\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"beaconBlockRoot\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validatorCount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"CheckpointFinalized\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"totalShareDeltaWei\",\"type\":\"int256\",\"indexed\":false,\"internalType\":\"int256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"EigenPodStaked\",\"inputs\":[{\"name\":\"pubkey\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"NonBeaconChainETHReceived\",\"inputs\":[{\"name\":\"amountReceived\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ProofSubmitterUpdated\",\"inputs\":[{\"name\":\"prevProofSubmitter\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newProofSubmitter\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RestakedBeaconChainETHWithdrawn\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorBalanceUpdated\",\"inputs\":[{\"name\":\"validatorIndex\",\"type\":\"uint40\",\"indexed\":false,\"internalType\":\"uint40\"},{\"name\":\"balanceTimestamp\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"newValidatorBalanceGwei\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorCheckpointed\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorIndex\",\"type\":\"uint40\",\"indexed\":true,\"internalType\":\"uint40\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorRestaked\",\"inputs\":[{\"name\":\"validatorIndex\",\"type\":\"uint40\",\"indexed\":false,\"internalType\":\"uint40\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorWithdrawn\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorIndex\",\"type\":\"uint40\",\"indexed\":true,\"internalType\":\"uint40\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AmountMustBeMultipleOfGwei\",\"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\":\"InputAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputArrayLengthMismatch\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InsufficientWithdrawableBalance\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidEIP4788Response\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidProof\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidProofLength\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidProofLength\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidPubKeyLength\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidValidatorFieldsLength\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MsgValueNot32ETH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NoActiveCheckpoint\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NoBalanceToCheckpoint\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"TimestampOutOfRange\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UnauthorizedCaller\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ValidatorInactiveOnBeaconChain\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ValidatorIsExitingBeaconChain\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ValidatorNotActiveInPod\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ValidatorNotSlashedOnBeaconChain\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"WithdrawCredentialsNotForEigenPod\",\"inputs\":[]}]", + Bin: "0x60e060405234801561001057600080fd5b50604051613ce3380380613ce383398101604081905261002f91610137565b6001600160a01b03808416608052821660a0526001600160401b03811660c05261005761005f565b505050610190565b600054610100900460ff16156100cb5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101561011d576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b038116811461013457600080fd5b50565b60008060006060848603121561014c57600080fd5b83516101578161011f565b60208501519093506101688161011f565b60408501519092506001600160401b038116811461018557600080fd5b809150509250925092565b60805160a05160c051613ad761020c60003960006105ff0152600081816102bd0152818161063a015281816106e4015281816109af01528181610b7601528181610e5f01528181610f0801528181611146015281816114af015281816115e601526126a90152600081816104b80152610f710152613ad76000f3fe60806040526004361061016a5760003560e01c80636fcd0e53116100d1578063c49074421161008a578063dda3346c11610064578063dda3346c1461058d578063ee94d67c146105ad578063f074ba62146105cd578063f2882461146105ed57600080fd5b8063c49074421461052d578063c4d66de81461054d578063d06d55871461056d57600080fd5b80636fcd0e53146104425780637439841f1461046f57806374cdd798146104a657806388676cad146104da5780639b4e4634146104fa578063b522538a1461050d57600080fd5b80634665bcda116101235780634665bcda146102ab57806347d28372146102df57806352396a591461039f57806358753357146103d557806358eaee79146103f55780636c0d2d5a1461042257600080fd5b8063039157d2146101a95780630b18ff66146101cb5780632340e8d3146102085780633474aa161461022c5780633f65cf191461026457806342ecff2a1461028457600080fd5b366101a4576040513481527f6fdd3dbdb173299608c0aa9f368735857c8842b581f8389238bf05bd04b3bf499060200160405180910390a1005b600080fd5b3480156101b557600080fd5b506101c96101c4366004612fd3565b610621565b005b3480156101d757600080fd5b506033546101eb906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561021457600080fd5b5061021e60395481565b6040519081526020016101ff565b34801561023857600080fd5b5060345461024c906001600160401b031681565b6040516001600160401b0390911681526020016101ff565b34801561027057600080fd5b506101c961027f366004613095565b610956565b34801561029057600080fd5b50603a5461024c90600160401b90046001600160401b031681565b3480156102b757600080fd5b506101eb7f000000000000000000000000000000000000000000000000000000000000000081565b3480156102eb57600080fd5b5061035b6040805160808101825260008082526020820181905291810182905260608101919091525060408051608081018252603c548152603d5462ffffff811660208301526001600160401b03630100000082041692820192909252600160581b909104600f0b606082015290565b6040516101ff91908151815260208083015162ffffff16908201526040808301516001600160401b031690820152606091820151600f0b9181019190915260800190565b3480156103ab57600080fd5b5061024c6103ba366004613173565b603b602052600090815260409020546001600160401b031681565b3480156103e157600080fd5b50603e546101eb906001600160a01b031681565b34801561040157600080fd5b506104156104103660046131cf565b610be0565b6040516101ff9190613248565b34801561042e57600080fd5b5061021e61043d366004613173565b610c45565b34801561044e57600080fd5b5061046261045d366004613256565b610d59565b6040516101ff919061326f565b34801561047b57600080fd5b5061041561048a366004613256565b600090815260366020526040902054600160c01b900460ff1690565b3480156104b257600080fd5b506101eb7f000000000000000000000000000000000000000000000000000000000000000081565b3480156104e657600080fd5b506101c96104f53660046132d1565b610e06565b6101c96105083660046132ee565b610efd565b34801561051957600080fd5b506104626105283660046131cf565b611048565b34801561053957600080fd5b506101c9610548366004613385565b61113b565b34801561055957600080fd5b506101c96105683660046133b1565b611287565b34801561057957600080fd5b506101c96105883660046133b1565b6113d7565b34801561059957600080fd5b506101c96105a83660046134a4565b61146b565b3480156105b957600080fd5b50603a5461024c906001600160401b031681565b3480156105d957600080fd5b506101c96105e836600461357d565b6115cd565b3480156105f957600080fd5b5061024c7f000000000000000000000000000000000000000000000000000000000000000081565b604051635ac86ab760e01b8152600660048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa158015610689573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106ad91906135e9565b156106cb5760405163840a48d560e01b815260040160405180910390fd5b604051635ac86ab760e01b8152600860048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa158015610733573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061075791906135e9565b156107755760405163840a48d560e01b815260040160405180910390fd5b60006107bb6107848580613606565b808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506119a092505050565b6000818152603660209081526040808320815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b8104909416928101929092529394509192906060830190600160c01b900460ff16600281111561082a5761082a613210565b600281111561083b5761083b613210565b81525050905080604001516001600160401b0316876001600160401b031611610877576040516337e07ffd60e01b815260040160405180910390fd5b60018160600151600281111561088f5761088f613210565b146108ad5760405163d49e19a760e01b815260040160405180910390fd5b6108f16108ba8680613606565b808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506119c492505050565b61090e5760405163161ce5ed60e31b815260040160405180910390fd5b61092061091a88610c45565b876119ee565b610943863561092f8780613606565b61093c60208a018a61364f565b8651611a94565b61094d6000611bbf565b50505050505050565b6033546001600160a01b03163314806109795750603e546001600160a01b031633145b61099657604051635c427cd960e01b815260040160405180910390fd5b604051635ac86ab760e01b8152600260048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa1580156109fe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a2291906135e9565b15610a405760405163840a48d560e01b815260040160405180910390fd5b8584148015610a4e57508382145b610a6b576040516343714afd60e01b815260040160405180910390fd5b603a546001600160401b03600160401b9091048116908a1611610aa1576040516337e07ffd60e01b815260040160405180910390fd5b610ab3610aad8a610c45565b896119ee565b6000805b87811015610b4c57610b388a358a8a84818110610ad657610ad6613695565b9050602002016020810190610aeb91906136ab565b898985818110610afd57610afd613695565b9050602002810190610b0f919061364f565b898987818110610b2157610b21613695565b9050602002810190610b339190613606565b611d38565b610b4290836136e8565b9150600101610ab7565b5060335460405163030b147160e61b81526001600160a01b039182166004820152602481018390527f00000000000000000000000000000000000000000000000000000000000000009091169063c2c51c4090604401600060405180830381600087803b158015610bbc57600080fd5b505af1158015610bd0573d6000803e3d6000fd5b5050505050505050505050505050565b600080610c2284848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506121a792505050565b600090815260366020526040902054600160c01b900460ff169150505b92915050565b6000610c54611fff600c6136fb565b610c676001600160401b03841642613712565b10610c8557604051637944e66d60e11b815260040160405180910390fd5b604080516001600160401b03841660208201526000918291720f3df6d732807ef1319fb7b8bb8522d0beac02910160408051601f1981840301815290829052610ccd91613749565b600060405180830381855afa9150503d8060008114610d08576040519150601f19603f3d011682016040523d82523d6000602084013e610d0d565b606091505b5091509150818015610d20575060008151115b610d3d5760405163558ad0a360e01b815260040160405180910390fd5b80806020019051810190610d519190613765565b949350505050565b610d816040805160808101825260008082526020820181905291810182905290606082015290565b600082815260366020908152604091829020825160808101845281546001600160401b038082168352600160401b8204811694830194909452600160801b810490931693810193909352906060830190600160c01b900460ff166002811115610dec57610dec613210565b6002811115610dfd57610dfd613210565b90525092915050565b6033546001600160a01b0316331480610e295750603e546001600160a01b031633145b610e4657604051635c427cd960e01b815260040160405180910390fd5b604051635ac86ab760e01b8152600660048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa158015610eae573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ed291906135e9565b15610ef05760405163840a48d560e01b815260040160405180910390fd5b610ef982611bbf565b5050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610f4657604051635c427cd960e01b815260040160405180910390fd5b346801bc16d674ec80000014610f6f5760405163049696b360e31b815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663228951186801bc16d674ec8000008787610fb261223c565b8888886040518863ffffffff1660e01b8152600401610fd6969594939291906137d3565b6000604051808303818588803b158015610fef57600080fd5b505af1158015611003573d6000803e3d6000fd5b50505050507f606865b7934a25d4aed43f6cdb426403353fa4b3009c4d228407474581b01e238585604051611039929190613822565b60405180910390a15050505050565b6110706040805160808101825260008082526020820181905291810182905290606082015290565b603660006110b385858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506121a792505050565b81526020808201929092526040908101600020815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b81049094169281019290925290916060830190600160c01b900460ff16600281111561112057611120613210565b600281111561113157611131613210565b9052509392505050565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461118457604051635c427cd960e01b815260040160405180910390fd5b611192633b9aca008261384c565b156111b0576040516321ddeb1760e21b815260040160405180910390fd5b60006111c0633b9aca0083613860565b6034549091506001600160401b0390811690821611156111f3576040516302c6f54760e21b815260040160405180910390fd5b603480548291906000906112119084906001600160401b0316613874565b92506101000a8154816001600160401b0302191690836001600160401b03160217905550826001600160a01b03167f8947fd2ce07ef9cc302c4e8f0461015615d91ce851564839e91cc804c2f49d8e8360405161127091815260200190565b60405180910390a26112828383612281565b505050565b600054610100900460ff16158080156112a75750600054600160ff909116105b806112c15750303b1580156112c1575060005460ff166001145b6113295760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff19166001179055801561134c576000805461ff0019166101001790555b6001600160a01b038216611373576040516339b190bb60e11b815260040160405180910390fd5b603380546001600160a01b0319166001600160a01b0384161790558015610ef9576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050565b6033546001600160a01b0316331461140257604051635c427cd960e01b815260040160405180910390fd5b603e54604080516001600160a01b03928316815291831660208301527ffb8129080a19d34dceac04ba253fc50304dc86c729bd63cdca4a969ad19a5eac910160405180910390a1603e80546001600160a01b0319166001600160a01b0392909216919091179055565b6033546001600160a01b0316331461149657604051635c427cd960e01b815260040160405180910390fd5b604051635ac86ab760e01b8152600560048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa1580156114fe573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061152291906135e9565b156115405760405163840a48d560e01b815260040160405180910390fd5b8251845114611562576040516343714afd60e01b815260040160405180910390fd5b60005b84518110156115c6576115be8385838151811061158457611584613695565b602002602001015187848151811061159e5761159e613695565b60200260200101516001600160a01b031661239a9092919063ffffffff16565b600101611565565b5050505050565b604051635ac86ab760e01b8152600760048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa158015611635573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061165991906135e9565b156116775760405163840a48d560e01b815260040160405180910390fd5b603a54600160401b90046001600160401b031660008190036116ac57604051631a544f4960e01b815260040160405180910390fd5b60408051608081018252603c54808252603d5462ffffff811660208401526001600160401b03630100000082041693830193909352600160581b909204600f0b6060820152906116fc90876123ec565b6000805b85811015611946573687878381811061171b5761171b613695565b905060200281019061172d9190613893565b80356000908152603660209081526040808320815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b8104909416928101929092529394509192906060830190600160c01b900460ff16600281111561179e5761179e613210565b60028111156117af576117af613210565b90525090506001816060015160028111156117cc576117cc613210565b146117d857505061193e565b856001600160401b031681604001516001600160401b0316106117fc57505061193e565b60008061180c83898e358761249e565b602089018051929450909250611821826138a9565b62ffffff1690525060608701805183919061183d9083906138c8565b600f0b90525061184d81876138f5565b84356000908152603660209081526040918290208651815492880151938801516001600160401b03908116600160801b0267ffffffffffffffff60801b19958216600160401b026001600160801b0319909516919092161792909217928316821781556060870151939950869390929091839160ff60c01b1990911668ffffffffffffffffff60801b1990911617600160c01b8360028111156118f2576118f2613210565b021790555050835160405164ffffffffff90911691506001600160401b038a16907fa91c59033c3423e18b54d0acecebb4972f9ea95aedf5f4cae3b677b02eaf3a3f90600090a3505050505b600101611700565b506001600160401b038084166000908152603b6020526040812080548493919291611973918591166138f5565b92506101000a8154816001600160401b0302191690836001600160401b0316021790555061094d826125c3565b6000816000815181106119b5576119b5613695565b60200260200101519050919050565b6000816003815181106119d9576119d9613695565b60200260200101516000801b14159050919050565b6119fa600360206136fb565b611a07602083018361364f565b905014611a27576040516313717da960e21b815260040160405180910390fd5b611a77611a37602083018361364f565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250869250508435905060036127cd565b610ef9576040516309bde33960e01b815260040160405180910390fd5b60088414611ab55760405163200591bd60e01b815260040160405180910390fd5b6005611ac3602860016136e8565b611acd91906136e8565b611ad89060206136fb565b8214611af7576040516313717da960e21b815260040160405180910390fd5b6000611b358686808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506127e592505050565b9050600064ffffffffff8316611b4d602860016136e8565b600b901b179050611b9885858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508c92508691508590506127cd565b611bb5576040516309bde33960e01b815260040160405180910390fd5b5050505050505050565b603a54600160401b90046001600160401b031615611bef5760405162be9bc360e81b815260040160405180910390fd5b603a546001600160401b03428116911603611c1d576040516367db5b8b60e01b815260040160405180910390fd5b6034546000906001600160401b0316611c3a633b9aca0047613860565b611c449190613874565b9050818015611c5a57506001600160401b038116155b15611c78576040516332dea95960e21b815260040160405180910390fd5b60006040518060800160405280611c8e42610c45565b815260200160395462ffffff168152602001836001600160401b031681526020016000600f0b815250905042603a60086101000a8154816001600160401b0302191690836001600160401b03160217905550611ce9816125c3565b805160208083015160405162ffffff90911681526001600160401b034216917f575796133bbed337e5b39aa49a30dc2556a91e0c6c2af4b7b886ae77ebef1076910160405180910390a3505050565b600080611d778484808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506119a092505050565b6000818152603660209081526040808320815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b8104909416928101929092529394509192906060830190600160c01b900460ff166002811115611de657611de6613210565b6002811115611df757611df7613210565b9052509050600081606001516002811115611e1457611e14613210565b14611e32576040516335e09e9d60e01b815260040160405180910390fd5b6001600160401b038016611e78868680806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250612a7e92505050565b6001600160401b031603611e9f57604051631958236d60e21b815260040160405180910390fd5b6001600160401b038016611ee5868680806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250612aa392505050565b6001600160401b031614611f0c57604051632eade63760e01b815260040160405180910390fd5b611f1461223c565b611f1d90613914565b611f59868680806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250612abb92505050565b14611f7757604051632230566760e11b815260040160405180910390fd5b6000611fb5868680806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250612ad092505050565b9050611fc58a87878b8b8e611a94565b60398054906000611fd583613938565b9091555050603a54600090600160401b90046001600160401b03161561200d57603a54600160401b90046001600160401b031661201a565b603a546001600160401b03165b6040805160808101825264ffffffffff8d1681526001600160401b03858116602083015283169181019190915290915060608101600190526000858152603660209081526040918290208351815492850151938501516001600160401b03908116600160801b0267ffffffffffffffff60801b19958216600160401b026001600160801b031990951691909216179290921792831682178155606084015190929091839160ff60c01b1990911668ffffffffffffffffff60801b1990911617600160c01b8360028111156120f0576120f0613210565b02179055505060405164ffffffffff8c1681527f2d0800bbc377ea54a08c5db6a87aafff5e3e9c8fead0eda110e40e0c10441449915060200160405180910390a16040805164ffffffffff8c1681526001600160401b03838116602083015284168183015290517f0e5fac175b83177cc047381e030d8fb3b42b37bd1c025e22c280facad62c32df9181900360600190a1612198633b9aca006001600160401b0384166136fb565b9b9a5050505050505050505050565b600081516030146121cb57604051634f88323960e11b815260040160405180910390fd5b6040516002906121e2908490600090602001613951565b60408051601f19818403018152908290526121fc91613749565b602060405180830381855afa158015612219573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190610c3f9190613765565b60408051600160f81b60208201526000602182015230606090811b6bffffffffffffffffffffffff1916602c8301529101604051602081830303815290604052905090565b804710156122d15760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401611320565b6000826001600160a01b03168260405160006040518083038185875af1925050503d806000811461231e576040519150601f19603f3d011682016040523d82523d6000602084013e612323565b606091505b50509050806112825760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401611320565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052611282908490612ae8565b6123f8600560036136e8565b6124039060206136fb565b612410602083018361364f565b905014612430576040516313717da960e21b815260040160405180910390fd5b606c612481612442602084018461364f565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508792505085359050846127cd565b611282576040516309bde33960e01b815260040160405180910390fd5b835160208501516000918291826124b6878488612bba565b9050816001600160401b0316816001600160401b031614612530576124db8183612c9d565b6040805164ffffffffff861681526001600160401b038b8116602083015284168183015290519196507f0e5fac175b83177cc047381e030d8fb3b42b37bd1c025e22c280facad62c32df919081900360600190a15b6001600160401b0380821660208b0181905290891660408b01526000036125b7576039805490600061256183613980565b9091555050600260608a015261257685613997565b93508264ffffffffff16886001600160401b03167f2a02361ffa66cf2c2da4682c2355a6adcaa9f6c227b6e6563e68480f9587626a60405160405180910390a35b50505094509492505050565b806020015162ffffff1660000361274d576000633b9aca00826060015183604001516001600160401b03166125f891906138c8565b600f0b61260591906139bd565b604083015160348054929350909160009061262a9084906001600160401b03166138f5565b82546101009290920a6001600160401b03818102199093169183160217909155603a8054600160401b81049092166001600160801b0319909216919091179055506000603c55603d80546001600160d81b031916905560335460405163030b147160e61b81526001600160a01b039182166004820152602481018390527f00000000000000000000000000000000000000000000000000000000000000009091169063c2c51c4090604401600060405180830381600087803b1580156126ef57600080fd5b505af1158015612703573d6000803e3d6000fd5b5050603a546040518481526001600160401b0390911692507f525408c201bc1576eb44116f6478f1c2a54775b19a043bcfdc708364f74f8e44915060200160405180910390a25050565b8051603c556020810151603d8054604084015160608501516fffffffffffffffffffffffffffffffff16600160581b026fffffffffffffffffffffffffffffffff60581b196001600160401b039092166301000000026affffffffffffffffffffff1990931662ffffff9095169490941791909117169190911790555b50565b6000836127db868585612cb5565b1495945050505050565b600080600283516127f69190613860565b90506000816001600160401b03811115612812576128126133ce565b60405190808252806020026020018201604052801561283b578160200160208202803683370190505b50905060005b828110156129385760028561285683836136fb565b8151811061286657612866613695565b60200260200101518683600261287c91906136fb565b6128879060016136e8565b8151811061289757612897613695565b60200260200101516040516020016128b9929190918252602082015260400190565b60408051601f19818403018152908290526128d391613749565b602060405180830381855afa1580156128f0573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906129139190613765565b82828151811061292557612925613695565b6020908102919091010152600101612841565b50612944600283613860565b91505b8115612a5a5760005b82811015612a475760028261296583836136fb565b8151811061297557612975613695565b60200260200101518383600261298b91906136fb565b6129969060016136e8565b815181106129a6576129a6613695565b60200260200101516040516020016129c8929190918252602082015260400190565b60408051601f19818403018152908290526129e291613749565b602060405180830381855afa1580156129ff573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190612a229190613765565b828281518110612a3457612a34613695565b6020908102919091010152600101612950565b50612a53600283613860565b9150612947565b80600081518110612a6d57612a6d613695565b602002602001015192505050919050565b6000610c3f82600581518110612a9657612a96613695565b6020026020010151612d92565b6000610c3f82600681518110612a9657612a96613695565b6000816001815181106119b5576119b5613695565b6000610c3f82600281518110612a9657612a96613695565b6000612b3d826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612df99092919063ffffffff16565b8051909150156112825780806020019051810190612b5b91906135e9565b6112825760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401611320565b6000612bc8602660016136e8565b612bd39060206136fb565b612be0604084018461364f565b905014612c00576040516313717da960e21b815260040160405180910390fd5b6000612c0d6004856139ed565b64ffffffffff169050612c67612c26604085018561364f565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525089925050506020860135846127cd565b612c84576040516309bde33960e01b815260040160405180910390fd5b612c92836020013585612e08565b9150505b9392505050565b6000612c966001600160401b03808416908516613a17565b60008351600014158015612cd4575060208451612cd2919061384c565b155b612cf1576040516313717da960e21b815260040160405180910390fd5b604080516020808201909252848152905b85518111612d8857612d1560028561384c565b600003612d4b578151600052808601516020526020826040600060026107d05a03fa612d4057600080fd5b600284049350612d76565b8086015160005281516020526020826040600060026107d05a03fa612d6f57600080fd5b6002840493505b612d816020826136e8565b9050612d02565b5051949350505050565b60f881901c60e882901c61ff00161760d882901c62ff0000161760c882901c63ff000000161764ff0000000060b883901c161765ff000000000060a883901c161766ff000000000000609883901c161767ff0000000000000060889290921c919091161790565b6060610d518484600085612e35565b600080612e16600484613a44565b612e21906040613a6e565b64ffffffffff169050610d5184821b612d92565b606082471015612e965760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401611320565b6001600160a01b0385163b612eed5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401611320565b600080866001600160a01b03168587604051612f099190613749565b60006040518083038185875af1925050503d8060008114612f46576040519150601f19603f3d011682016040523d82523d6000602084013e612f4b565b606091505b5091509150612f5b828286612f66565b979650505050505050565b60608315612f75575081612c96565b825115612f855782518084602001fd5b8160405162461bcd60e51b81526004016113209190613a8e565b80356001600160401b0381168114612fb657600080fd5b919050565b600060408284031215612fcd57600080fd5b50919050565b600080600060608486031215612fe857600080fd5b612ff184612f9f565b925060208401356001600160401b0381111561300c57600080fd5b61301886828701612fbb565b92505060408401356001600160401b0381111561303457600080fd5b61304086828701612fbb565b9150509250925092565b60008083601f84011261305c57600080fd5b5081356001600160401b0381111561307357600080fd5b6020830191508360208260051b850101111561308e57600080fd5b9250929050565b60008060008060008060008060a0898b0312156130b157600080fd5b6130ba89612f9f565b975060208901356001600160401b038111156130d557600080fd5b6130e18b828c01612fbb565b97505060408901356001600160401b038111156130fd57600080fd5b6131098b828c0161304a565b90975095505060608901356001600160401b0381111561312857600080fd5b6131348b828c0161304a565b90955093505060808901356001600160401b0381111561315357600080fd5b61315f8b828c0161304a565b999c989b5096995094979396929594505050565b60006020828403121561318557600080fd5b612c9682612f9f565b60008083601f8401126131a057600080fd5b5081356001600160401b038111156131b757600080fd5b60208301915083602082850101111561308e57600080fd5b600080602083850312156131e257600080fd5b82356001600160401b038111156131f857600080fd5b6132048582860161318e565b90969095509350505050565b634e487b7160e01b600052602160045260246000fd5b6003811061324457634e487b7160e01b600052602160045260246000fd5b9052565b60208101610c3f8284613226565b60006020828403121561326857600080fd5b5035919050565b60006080820190506001600160401b0383511682526001600160401b0360208401511660208301526001600160401b03604084015116604083015260608301516132bc6060840182613226565b5092915050565b80151581146127ca57600080fd5b6000602082840312156132e357600080fd5b8135612c96816132c3565b60008060008060006060868803121561330657600080fd5b85356001600160401b0381111561331c57600080fd5b6133288882890161318e565b90965094505060208601356001600160401b0381111561334757600080fd5b6133538882890161318e565b96999598509660400135949350505050565b6001600160a01b03811681146127ca57600080fd5b8035612fb681613365565b6000806040838503121561339857600080fd5b82356133a381613365565b946020939093013593505050565b6000602082840312156133c357600080fd5b8135612c9681613365565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171561340c5761340c6133ce565b604052919050565b60006001600160401b0382111561342d5761342d6133ce565b5060051b60200190565b600082601f83011261344857600080fd5b813561345b61345682613414565b6133e4565b8082825260208201915060208360051b86010192508583111561347d57600080fd5b602085015b8381101561349a578035835260209283019201613482565b5095945050505050565b6000806000606084860312156134b957600080fd5b83356001600160401b038111156134cf57600080fd5b8401601f810186136134e057600080fd5b80356134ee61345682613414565b8082825260208201915060208360051b85010192508883111561351057600080fd5b6020840193505b8284101561353b57833561352a81613365565b825260209384019390910190613517565b955050505060208401356001600160401b0381111561355957600080fd5b61356586828701613437565b9250506135746040850161337a565b90509250925092565b60008060006040848603121561359257600080fd5b83356001600160401b038111156135a857600080fd5b6135b486828701612fbb565b93505060208401356001600160401b038111156135d057600080fd5b6135dc8682870161304a565b9497909650939450505050565b6000602082840312156135fb57600080fd5b8151612c96816132c3565b6000808335601e1984360301811261361d57600080fd5b8301803591506001600160401b0382111561363757600080fd5b6020019150600581901b360382131561308e57600080fd5b6000808335601e1984360301811261366657600080fd5b8301803591506001600160401b0382111561368057600080fd5b60200191503681900382131561308e57600080fd5b634e487b7160e01b600052603260045260246000fd5b6000602082840312156136bd57600080fd5b813564ffffffffff81168114612c9657600080fd5b634e487b7160e01b600052601160045260246000fd5b80820180821115610c3f57610c3f6136d2565b8082028115828204841417610c3f57610c3f6136d2565b81810381811115610c3f57610c3f6136d2565b60005b83811015613740578181015183820152602001613728565b50506000910152565b6000825161375b818460208701613725565b9190910192915050565b60006020828403121561377757600080fd5b5051919050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b600081518084526137bf816020860160208601613725565b601f01601f19169290920160200192915050565b6080815260006137e760808301888a61377e565b82810360208401526137f981886137a7565b9050828103604084015261380e81868861377e565b915050826060830152979650505050505050565b602081526000610d5160208301848661377e565b634e487b7160e01b600052601260045260246000fd5b60008261385b5761385b613836565b500690565b60008261386f5761386f613836565b500490565b6001600160401b038281168282160390811115610c3f57610c3f6136d2565b60008235605e1983360301811261375b57600080fd5b600062ffffff8216806138be576138be6136d2565b6000190192915050565b600f81810b9083900b0160016001607f1b03811360016001607f1b031982121715610c3f57610c3f6136d2565b6001600160401b038181168382160190811115610c3f57610c3f6136d2565b80516020808301519190811015612fcd5760001960209190910360031b1b16919050565b60006001820161394a5761394a6136d2565b5060010190565b60008351613963818460208801613725565b6001600160801b0319939093169190920190815260100192915050565b60008161398f5761398f6136d2565b506000190190565b600081600f0b60016001607f1b031981036139b4576139b46136d2565b60000392915050565b80820260008212600160ff1b841416156139d9576139d96136d2565b8181058314821517610c3f57610c3f6136d2565b600064ffffffffff831680613a0457613a04613836565b8064ffffffffff84160491505092915050565b600f82810b9082900b0360016001607f1b0319811260016001607f1b0382131715610c3f57610c3f6136d2565b600064ffffffffff831680613a5b57613a5b613836565b8064ffffffffff84160691505092915050565b64ffffffffff81811683821602908116908181146132bc576132bc6136d2565b602081526000612c9660208301846137a756fea26469706673582212209e075b43bbcca176175fb3a36f1f6917ac5855ce95f3ee3faea93db4c35c7ce264736f6c634300081b0033", } // EigenPodABI is the input ABI used to generate the binding from. diff --git a/pkg/bindings/EigenPodManager/binding.go b/pkg/bindings/EigenPodManager/binding.go index 9b44ba82d..783f74e36 100644 --- a/pkg/bindings/EigenPodManager/binding.go +++ b/pkg/bindings/EigenPodManager/binding.go @@ -31,8 +31,8 @@ var ( // EigenPodManagerMetaData contains all meta data concerning the EigenPodManager contract. var EigenPodManagerMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_ethPOS\",\"type\":\"address\",\"internalType\":\"contractIETHPOSDeposit\"},{\"name\":\"_eigenPodBeacon\",\"type\":\"address\",\"internalType\":\"contractIBeacon\"},{\"name\":\"_strategyManager\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"},{\"name\":\"_slasher\",\"type\":\"address\",\"internalType\":\"contractISlasher\"},{\"name\":\"_delegationManager\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addShares\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"beaconChainETHStrategy\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"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\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"},{\"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\":\"\",\"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\":\"podOwnerShares\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"int256\",\"internalType\":\"int256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"recordBeaconChainETHBalanceUpdate\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"sharesDelta\",\"type\":\"int256\",\"internalType\":\"int256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeShares\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setPauserRegistry\",\"inputs\":[{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"slasher\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractISlasher\"}],\"stateMutability\":\"view\"},{\"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\":\"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\":\"withdrawSharesAsTokens\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destination\",\"type\":\"address\",\"internalType\":\"address\"},{\"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\":\"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\":\"PauserRegistrySet\",\"inputs\":[{\"name\":\"pauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PodDeployed\",\"inputs\":[{\"name\":\"eigenPod\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PodSharesUpdated\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"sharesDelta\",\"type\":\"int256\",\"indexed\":false,\"internalType\":\"int256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false}]", - Bin: "0x6101206040523480156200001257600080fd5b50604051620031693803806200316983398101604081905262000035916200014b565b6001600160a01b0380861660805280851660a05280841660c05280831660e0528116610100526200006562000070565b5050505050620001cb565b600054610100900460ff1615620000dd5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101562000130576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146200014857600080fd5b50565b600080600080600060a086880312156200016457600080fd5b8551620001718162000132565b6020870151909550620001848162000132565b6040870151909450620001978162000132565b6060870151909350620001aa8162000132565b6080870151909250620001bd8162000132565b809150509295509295909350565b60805160a05160c05160e05161010051612f286200024160003960008181610551015281816105fb01528181610b7901528181611313015281816117bf01526118af015260006104dd015260006102cf015260008181610263015281816112920152611e64015260006103af0152612f286000f3fe6080604052600436106101b75760003560e01c8063886f1195116100ec578063b13442711161008a578063ea4d3c9b11610064578063ea4d3c9b1461053f578063f2fde38b14610573578063f6848d2414610593578063fabc1cbc146105ce57600080fd5b8063b1344271146104cb578063beffbb89146104ff578063c2c51c401461051f57600080fd5b80639b4e4634116100c65780639b4e46341461044c5780639ba062751461045f578063a38406a314610495578063a6a509be146104b557600080fd5b8063886f1195146103e65780638da5cb5b146104065780639104c3191461042457600080fd5b8063595c6a671161015957806360f4062b1161013357806360f4062b1461035b578063715018a61461038857806374cdd7981461039d57806384d81062146103d157600080fd5b8063595c6a67146102f15780635ac86ab7146103065780635c975abb1461034657600080fd5b80631794bb3c116101955780631794bb3c14610231578063292b7b2b14610251578063387b13001461029d57806339b70e38146102bd57600080fd5b80630e81073c146101bc57806310d67a2f146101ef578063136439dd14610211575b600080fd5b3480156101c857600080fd5b506101dc6101d73660046120fc565b6105ee565b6040519081526020015b60405180910390f35b3480156101fb57600080fd5b5061020f61020a366004612128565b61085d565b005b34801561021d57600080fd5b5061020f61022c366004612145565b610910565b34801561023d57600080fd5b5061020f61024c36600461215e565b610a4f565b34801561025d57600080fd5b506102857f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016101e6565b3480156102a957600080fd5b5061020f6102b836600461215e565b610b6e565b3480156102c957600080fd5b506102857f000000000000000000000000000000000000000000000000000000000000000081565b3480156102fd57600080fd5b5061020f610f82565b34801561031257600080fd5b5061033661032136600461219f565b606654600160ff9092169190911b9081161490565b60405190151581526020016101e6565b34801561035257600080fd5b506066546101dc565b34801561036757600080fd5b506101dc610376366004612128565b609b6020526000908152604090205481565b34801561039457600080fd5b5061020f611049565b3480156103a957600080fd5b506102857f000000000000000000000000000000000000000000000000000000000000000081565b3480156103dd57600080fd5b5061028561105d565b3480156103f257600080fd5b50606554610285906001600160a01b031681565b34801561041257600080fd5b506033546001600160a01b0316610285565b34801561043057600080fd5b5061028573beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac081565b61020f61045a36600461220b565b611147565b34801561046b57600080fd5b5061028561047a366004612128565b6098602052600090815260409020546001600160a01b031681565b3480156104a157600080fd5b506102856104b0366004612128565b611236565b3480156104c157600080fd5b506101dc60995481565b3480156104d757600080fd5b506102857f000000000000000000000000000000000000000000000000000000000000000081565b34801561050b57600080fd5b5061020f61051a3660046120fc565b611308565b34801561052b57600080fd5b5061020f61053a3660046120fc565b611547565b34801561054b57600080fd5b506102857f000000000000000000000000000000000000000000000000000000000000000081565b34801561057f57600080fd5b5061020f61058e366004612128565b61197b565b34801561059f57600080fd5b506103366105ae366004612128565b6001600160a01b0390811660009081526098602052604090205416151590565b3480156105da57600080fd5b5061020f6105e9366004612145565b6119f1565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146106415760405162461bcd60e51b81526004016106389061227f565b60405180910390fd5b6001600160a01b0383166106bd5760405162461bcd60e51b815260206004820152603a60248201527f456967656e506f644d616e616765722e6164645368617265733a20706f644f7760448201527f6e65722063616e6e6f74206265207a65726f20616464726573730000000000006064820152608401610638565b600082121561072b5760405162461bcd60e51b815260206004820152603460248201527f456967656e506f644d616e616765722e6164645368617265733a207368617265604482015273732063616e6e6f74206265206e6567617469766560601b6064820152608401610638565b610739633b9aca00836122f3565b156107ac5760405162461bcd60e51b815260206004820152603d60248201527f456967656e506f644d616e616765722e6164645368617265733a20736861726560448201527f73206d75737420626520612077686f6c65204777656920616d6f756e740000006064820152608401610638565b6001600160a01b0383166000908152609b6020526040812054906107d0848361231d565b6001600160a01b0386166000818152609b6020526040908190208390555191925090600080516020612eb38339815191529061080f9087815260200190565b60405180910390a2846001600160a01b03166000805160206125858339815191528260405161084091815260200190565b60405180910390a26108528282611b4d565b925050505b92915050565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108d4919061235e565b6001600160a01b0316336001600160a01b0316146109045760405162461bcd60e51b81526004016106389061237b565b61090d81611b8f565b50565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015610958573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061097c91906123c5565b6109985760405162461bcd60e51b8152600401610638906123e7565b60665481811614610a115760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c69747900000000000000006064820152608401610638565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b600054610100900460ff1615808015610a6f5750600054600160ff909116105b80610a895750303b158015610a89575060005460ff166001145b610aec5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610638565b6000805460ff191660011790558015610b0f576000805461ff0019166101001790555b610b1884611c86565b610b228383611cd8565b8015610b68576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610bb65760405162461bcd60e51b81526004016106389061227f565b6001600160a01b038316610c305760405162461bcd60e51b81526020600482015260476024820152600080516020612ed383398151915260448201527f546f6b656e733a20706f644f776e65722063616e6e6f74206265207a65726f206064820152666164647265737360c81b608482015260a401610638565b6001600160a01b038216610cad5760405162461bcd60e51b815260206004820152604a6024820152600080516020612ed383398151915260448201527f546f6b656e733a2064657374696e6174696f6e2063616e6e6f74206265207a65606482015269726f206164647265737360b01b608482015260a401610638565b6000811215610d1c5760405162461bcd60e51b81526020600482015260416024820152600080516020612ed383398151915260448201527f546f6b656e733a207368617265732063616e6e6f74206265206e6567617469766064820152606560f81b608482015260a401610638565b610d2a633b9aca00826122f3565b15610d9e5760405162461bcd60e51b815260206004820152604a6024820152600080516020612ed383398151915260448201527f546f6b656e733a20736861726573206d75737420626520612077686f6c6520476064820152691dd95a48185b5bdd5b9d60b21b608482015260a401610638565b6001600160a01b0383166000908152609b602052604081205490811215610f07576000610dca8261242f565b905080831115610e61576001600160a01b0385166000908152609b6020526040812055610df7818461244c565b9250846001600160a01b0316600080516020612eb383398151915282604051610e2291815260200190565b60405180910390a2846001600160a01b03166000805160206125858339815191526000604051610e5491815260200190565b60405180910390a2610f05565b6001600160a01b0385166000908152609b6020526040812054610e8590859061231d565b6001600160a01b0387166000818152609b6020526040908190208390555191925090600080516020612eb383398151915290610ec49087815260200190565b60405180910390a2856001600160a01b031660008051602061258583398151915282604051610ef591815260200190565b60405180910390a2505050505050565b505b6001600160a01b03848116600090815260986020526040908190205490516362483a2160e11b815285831660048201526024810185905291169063c490744290604401600060405180830381600087803b158015610f6457600080fd5b505af1158015610f78573d6000803e3d6000fd5b5050505050505050565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015610fca573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fee91906123c5565b61100a5760405162461bcd60e51b8152600401610638906123e7565b600019606681905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b611051611dc2565b61105b6000611c86565b565b6066546000908190600190811614156110b45760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b6044820152606401610638565b336000908152609860205260409020546001600160a01b0316156111365760405162461bcd60e51b815260206004820152603360248201527f456967656e506f644d616e616765722e637265617465506f643a2053656e64656044820152721c88185b1c9958591e481a185cc818481c1bd9606a1b6064820152608401610638565b6000611140611e1c565b9250505090565b6066546000906001908116141561119c5760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b6044820152606401610638565b336000908152609860205260409020546001600160a01b0316806111c5576111c2611e1c565b90505b6040516326d3918d60e21b81526001600160a01b03821690639b4e46349034906111fb908b908b908b908b908b9060040161248c565b6000604051808303818588803b15801561121457600080fd5b505af1158015611228573d6000803e3d6000fd5b505050505050505050505050565b6001600160a01b038082166000908152609860205260408120549091168061085757611301836001600160a01b031660001b60405180610940016040528061090e81526020016125a561090e9139604080516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166020820152808201919091526000606082015260800160408051601f19818403018152908290526112e69291602001612501565b60405160208183030381529060405280519060200120611f81565b9392505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146113505760405162461bcd60e51b81526004016106389061227f565b60008112156113c75760405162461bcd60e51b815260206004820152603760248201527f456967656e506f644d616e616765722e72656d6f76655368617265733a20736860448201527f617265732063616e6e6f74206265206e656761746976650000000000000000006064820152608401610638565b6113d5633b9aca00826122f3565b1561144a576040805162461bcd60e51b81526020600482015260248101919091527f456967656e506f644d616e616765722e72656d6f76655368617265733a20736860448201527f61726573206d75737420626520612077686f6c65204777656920616d6f756e746064820152608401610638565b6001600160a01b0382166000908152609b602052604081205461146e908390612516565b905060008112156114ff5760405162461bcd60e51b815260206004820152604f60248201527f456967656e506f644d616e616765722e72656d6f76655368617265733a20636160448201527f6e6e6f7420726573756c7420696e20706f64206f776e657220686176696e672060648201526e6e656761746976652073686172657360881b608482015260a401610638565b6001600160a01b0383166000818152609b602052604090819020839055516000805160206125858339815191529061153a9084815260200190565b60405180910390a2505050565b6001600160a01b0380831660009081526098602052604090205483911633146115c25760405162461bcd60e51b815260206004820152602760248201527f456967656e506f644d616e616765722e6f6e6c79456967656e506f643a206e6f6044820152661d0818481c1bd960ca1b6064820152608401610638565b600260c95414156116155760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610638565b600260c9556001600160a01b0383166116b15760405162461bcd60e51b815260206004820152605260248201527f456967656e506f644d616e616765722e7265636f7264426561636f6e4368616960448201527f6e45544842616c616e63655570646174653a20706f644f776e65722063616e6e6064820152716f74206265207a65726f206164647265737360701b608482015260a401610638565b6116bf633b9aca0083612555565b156117585760405162461bcd60e51b815260206004820152605a60248201527f456967656e506f644d616e616765722e7265636f7264426561636f6e4368616960448201527f6e45544842616c616e63655570646174653a2073686172657344656c7461206d60648201527f75737420626520612077686f6c65204777656920616d6f756e74000000000000608482015260a401610638565b6001600160a01b0383166000908152609b60205260408120549061177c848361231d565b6001600160a01b0386166000908152609b602052604081208290559091506117a48383611b4d565b9050801561190c57600081121561186f576001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001663132d49678773beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac06118038561242f565b6040516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301526044820152606401600060405180830381600087803b15801561185257600080fd5b505af1158015611866573d6000803e3d6000fd5b5050505061190c565b604051631452b9d760e11b81526001600160a01b03878116600483015273beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac06024830152604482018390527f000000000000000000000000000000000000000000000000000000000000000016906328a573ae90606401600060405180830381600087803b1580156118f357600080fd5b505af1158015611907573d6000803e3d6000fd5b505050505b856001600160a01b0316600080516020612eb38339815191528660405161193591815260200190565b60405180910390a2856001600160a01b03166000805160206125858339815191528360405161196691815260200190565b60405180910390a25050600160c95550505050565b611983611dc2565b6001600160a01b0381166119e85760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610638565b61090d81611c86565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a44573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a68919061235e565b6001600160a01b0316336001600160a01b031614611a985760405162461bcd60e51b81526004016106389061237b565b606654198119606654191614611b165760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c69747900000000000000006064820152608401610638565b606681905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c90602001610a44565b6000808313611b6d5760008213611b6657506000610857565b5080610857565b60008213611b8557611b7e8361242f565b9050610857565b611b7e8383612516565b6001600160a01b038116611c1d5760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a401610638565b606554604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1606580546001600160a01b0319166001600160a01b0392909216919091179055565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6065546001600160a01b0316158015611cf957506001600160a01b03821615155b611d7b5760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a401610638565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2611dbe82611b8f565b5050565b6033546001600160a01b0316331461105b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610638565b6000609960008154611e2d90612569565b9091555060408051610940810190915261090e808252600091611ecc91839133916125a56020830139604080516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166020820152808201919091526000606082015260800160408051601f1981840301815290829052611eb89291602001612501565b604051602081830303815290604052611fdd565b60405163189acdbd60e31b81523360048201529091506001600160a01b0382169063c4d66de890602401600060405180830381600087803b158015611f1057600080fd5b505af1158015611f24573d6000803e3d6000fd5b50503360008181526098602052604080822080546001600160a01b0319166001600160a01b038816908117909155905192945092507f21c99d0db02213c32fff5b05cf0a718ab5f858802b91498f80d82270289d856a91a3919050565b604080516001600160f81b03196020808301919091526bffffffffffffffffffffffff193060601b1660218301526035820185905260558083018590528351808403909101815260759092019092528051910120600090611301565b600080844710156120305760405162461bcd60e51b815260206004820152601d60248201527f437265617465323a20696e73756666696369656e742062616c616e63650000006044820152606401610638565b825161207e5760405162461bcd60e51b815260206004820181905260248201527f437265617465323a2062797465636f6465206c656e677468206973207a65726f6044820152606401610638565b8383516020850187f590506001600160a01b0381166120df5760405162461bcd60e51b815260206004820152601960248201527f437265617465323a204661696c6564206f6e206465706c6f79000000000000006044820152606401610638565b949350505050565b6001600160a01b038116811461090d57600080fd5b6000806040838503121561210f57600080fd5b823561211a816120e7565b946020939093013593505050565b60006020828403121561213a57600080fd5b8135611301816120e7565b60006020828403121561215757600080fd5b5035919050565b60008060006060848603121561217357600080fd5b833561217e816120e7565b9250602084013561218e816120e7565b929592945050506040919091013590565b6000602082840312156121b157600080fd5b813560ff8116811461130157600080fd5b60008083601f8401126121d457600080fd5b50813567ffffffffffffffff8111156121ec57600080fd5b60208301915083602082850101111561220457600080fd5b9250929050565b60008060008060006060868803121561222357600080fd5b853567ffffffffffffffff8082111561223b57600080fd5b61224789838a016121c2565b9097509550602088013591508082111561226057600080fd5b5061226d888289016121c2565b96999598509660400135949350505050565b602080825260409082018190527f456967656e506f644d616e616765722e6f6e6c7944656c65676174696f6e4d61908201527f6e616765723a206e6f74207468652044656c65676174696f6e4d616e61676572606082015260800190565b634e487b7160e01b600052601260045260246000fd5b600082612302576123026122dd565b500690565b634e487b7160e01b600052601160045260246000fd5b600080821280156001600160ff1b038490038513161561233f5761233f612307565b600160ff1b839003841281161561235857612358612307565b50500190565b60006020828403121561237057600080fd5b8151611301816120e7565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b6000602082840312156123d757600080fd5b8151801515811461130157600080fd5b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b6000600160ff1b82141561244557612445612307565b5060000390565b60008282101561245e5761245e612307565b500390565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6060815260006124a0606083018789612463565b82810360208401526124b3818688612463565b9150508260408301529695505050505050565b6000815160005b818110156124e757602081850181015186830152016124cd565b818111156124f6576000828601525b509290920192915050565b60006120df61251083866124c6565b846124c6565b60008083128015600160ff1b85018412161561253457612534612307565b6001600160ff1b038401831381161561254f5761254f612307565b50500390565b600082612564576125646122dd565b500790565b600060001982141561257d5761257d612307565b506001019056fed4def76d6d2bed6f14d5cd9af73cc2913d618d00edde42432e81c09bfe077098608060405260405161090e38038061090e83398101604081905261002291610460565b61002e82826000610035565b505061058a565b61003e83610100565b6040516001600160a01b038416907f1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e90600090a260008251118061007f5750805b156100fb576100f9836001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100e99190610520565b836102a360201b6100291760201c565b505b505050565b610113816102cf60201b6100551760201c565b6101725760405162461bcd60e51b815260206004820152602560248201527f455243313936373a206e657720626561636f6e206973206e6f74206120636f6e6044820152641d1c9858dd60da1b60648201526084015b60405180910390fd5b6101e6816001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156101b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101d79190610520565b6102cf60201b6100551760201c565b61024b5760405162461bcd60e51b815260206004820152603060248201527f455243313936373a20626561636f6e20696d706c656d656e746174696f6e206960448201526f1cc81b9bdd08184818dbdb9d1c9858dd60821b6064820152608401610169565b806102827fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d5060001b6102de60201b6100641760201c565b80546001600160a01b0319166001600160a01b039290921691909117905550565b60606102c883836040518060600160405280602781526020016108e7602791396102e1565b9392505050565b6001600160a01b03163b151590565b90565b6060600080856001600160a01b0316856040516102fe919061053b565b600060405180830381855af49150503d8060008114610339576040519150601f19603f3d011682016040523d82523d6000602084013e61033e565b606091505b5090925090506103508683838761035a565b9695505050505050565b606083156103c65782516103bf576001600160a01b0385163b6103bf5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610169565b50816103d0565b6103d083836103d8565b949350505050565b8151156103e85781518083602001fd5b8060405162461bcd60e51b81526004016101699190610557565b80516001600160a01b038116811461041957600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b8381101561044f578181015183820152602001610437565b838111156100f95750506000910152565b6000806040838503121561047357600080fd5b61047c83610402565b60208401519092506001600160401b038082111561049957600080fd5b818501915085601f8301126104ad57600080fd5b8151818111156104bf576104bf61041e565b604051601f8201601f19908116603f011681019083821181831017156104e7576104e761041e565b8160405282815288602084870101111561050057600080fd5b610511836020830160208801610434565b80955050505050509250929050565b60006020828403121561053257600080fd5b6102c882610402565b6000825161054d818460208701610434565b9190910192915050565b6020815260008251806020840152610576816040850160208701610434565b601f01601f19169190910160400192915050565b61034e806105996000396000f3fe60806040523661001357610011610017565b005b6100115b610027610022610067565b610100565b565b606061004e83836040518060600160405280602781526020016102f260279139610124565b9392505050565b6001600160a01b03163b151590565b90565b600061009a7fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50546001600160a01b031690565b6001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100fb9190610249565b905090565b3660008037600080366000845af43d6000803e80801561011f573d6000f35b3d6000fd5b6060600080856001600160a01b03168560405161014191906102a2565b600060405180830381855af49150503d806000811461017c576040519150601f19603f3d011682016040523d82523d6000602084013e610181565b606091505b50915091506101928683838761019c565b9695505050505050565b6060831561020d578251610206576001600160a01b0385163b6102065760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064015b60405180910390fd5b5081610217565b610217838361021f565b949350505050565b81511561022f5781518083602001fd5b8060405162461bcd60e51b81526004016101fd91906102be565b60006020828403121561025b57600080fd5b81516001600160a01b038116811461004e57600080fd5b60005b8381101561028d578181015183820152602001610275565b8381111561029c576000848401525b50505050565b600082516102b4818460208701610272565b9190910192915050565b60208152600082518060208401526102dd816040850160208701610272565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220d51e81d3bc5ed20a26aeb05dce7e825c503b2061aa78628027300c8d65b9d89a64736f6c634300080c0033416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c65644e2b791dedccd9fb30141b088cabf5c14a8912b52f59375c95c010700b8c6193456967656e506f644d616e616765722e77697468647261775368617265734173a264697066735822122069d3a03119733341cd267e296785e37b1c350fc350d796fc97aa45c1e8213da664736f6c634300080c0033", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_ethPOS\",\"type\":\"address\",\"internalType\":\"contractIETHPOSDeposit\"},{\"name\":\"_eigenPodBeacon\",\"type\":\"address\",\"internalType\":\"contractIBeacon\"},{\"name\":\"_strategyManager\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"},{\"name\":\"_slasher\",\"type\":\"address\",\"internalType\":\"contractISlasher\"},{\"name\":\"_delegationManager\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addShares\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"beaconChainETHStrategy\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"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\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"},{\"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\":\"\",\"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\":\"podOwnerShares\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"int256\",\"internalType\":\"int256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"recordBeaconChainETHBalanceUpdate\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"sharesDelta\",\"type\":\"int256\",\"internalType\":\"int256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeShares\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setPauserRegistry\",\"inputs\":[{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"slasher\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractISlasher\"}],\"stateMutability\":\"view\"},{\"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\":\"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\":\"withdrawSharesAsTokens\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destination\",\"type\":\"address\",\"internalType\":\"address\"},{\"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\":\"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\":\"PauserRegistrySet\",\"inputs\":[{\"name\":\"pauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PodDeployed\",\"inputs\":[{\"name\":\"eigenPod\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PodSharesUpdated\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"sharesDelta\",\"type\":\"int256\",\"indexed\":false,\"internalType\":\"int256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"CurrentlyPaused\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"EigenPodAlreadyExists\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNewPausedStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyPauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnpauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SharesNegative\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SharesNotMultipleOfGwei\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UnauthorizedCaller\",\"inputs\":[]}]", + Bin: "0x61012060405234801561001157600080fd5b5060405161296b38038061296b83398101604081905261003091610140565b6001600160a01b0380861660805280851660a05280841660c05280831660e05281166101005261005e610068565b50505050506101b5565b600054610100900460ff16156100d45760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff9081161015610126576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b038116811461013d57600080fd5b50565b600080600080600060a0868803121561015857600080fd5b855161016381610128565b602087015190955061017481610128565b604087015190945061018581610128565b606087015190935061019681610128565b60808701519092506101a781610128565b809150509295509295909350565b60805160a05160c05160e0516101005161274161022a60003960008181610551015281816105fb01528181610a2d01528181610fda015281816112430152611333015260006104dd015260006102cf01526000818161026301528181610f5901526117c8015260006103af01526127416000f3fe6080604052600436106101b75760003560e01c8063886f1195116100ec578063b13442711161008a578063ea4d3c9b11610064578063ea4d3c9b1461053f578063f2fde38b14610573578063f6848d2414610593578063fabc1cbc146105ce57600080fd5b8063b1344271146104cb578063beffbb89146104ff578063c2c51c401461051f57600080fd5b80639b4e4634116100c65780639b4e46341461044c5780639ba062751461045f578063a38406a314610495578063a6a509be146104b557600080fd5b8063886f1195146103e65780638da5cb5b146104065780639104c3191461042457600080fd5b8063595c6a671161015957806360f4062b1161013357806360f4062b1461035b578063715018a61461038857806374cdd7981461039d57806384d81062146103d157600080fd5b8063595c6a67146102f15780635ac86ab7146103065780635c975abb1461034657600080fd5b80631794bb3c116101955780631794bb3c14610231578063292b7b2b14610251578063387b13001461029d57806339b70e38146102bd57600080fd5b80630e81073c146101bc57806310d67a2f146101ef578063136439dd14610211575b600080fd5b3480156101c857600080fd5b506101dc6101d7366004611a63565b6105ee565b6040519081526020015b60405180910390f35b3480156101fb57600080fd5b5061020f61020a366004611a8f565b61075f565b005b34801561021d57600080fd5b5061020f61022c366004611aac565b610813565b34801561023d57600080fd5b5061020f61024c366004611ac5565b6108fe565b34801561025d57600080fd5b506102857f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016101e6565b3480156102a957600080fd5b5061020f6102b8366004611ac5565b610a22565b3480156102c957600080fd5b506102857f000000000000000000000000000000000000000000000000000000000000000081565b3480156102fd57600080fd5b5061020f610ceb565b34801561031257600080fd5b50610336610321366004611b06565b606654600160ff9092169190911b9081161490565b60405190151581526020016101e6565b34801561035257600080fd5b506066546101dc565b34801561036757600080fd5b506101dc610376366004611a8f565b609b6020526000908152604090205481565b34801561039457600080fd5b5061020f610db3565b3480156103a957600080fd5b506102857f000000000000000000000000000000000000000000000000000000000000000081565b3480156103dd57600080fd5b50610285610dc7565b3480156103f257600080fd5b50606554610285906001600160a01b031681565b34801561041257600080fd5b506033546001600160a01b0316610285565b34801561043057600080fd5b5061028573beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac081565b61020f61045a366004611b72565b610e3a565b34801561046b57600080fd5b5061028561047a366004611a8f565b6098602052600090815260409020546001600160a01b031681565b3480156104a157600080fd5b506102856104b0366004611a8f565b610efd565b3480156104c157600080fd5b506101dc60995481565b3480156104d757600080fd5b506102857f000000000000000000000000000000000000000000000000000000000000000081565b34801561050b57600080fd5b5061020f61051a366004611a63565b610fcf565b34801561052b57600080fd5b5061020f61053a366004611a63565b6110f6565b34801561054b57600080fd5b506102857f000000000000000000000000000000000000000000000000000000000000000081565b34801561057f57600080fd5b5061020f61058e366004611a8f565b6113ff565b34801561059f57600080fd5b506103366105ae366004611a8f565b6001600160a01b0390811660009081526098602052604090205416151590565b3480156105da57600080fd5b5061020f6105e9366004611aac565b611475565b6000336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461063957604051635c427cd960e01b815260040160405180910390fd5b6001600160a01b038316610660576040516339b190bb60e11b815260040160405180910390fd5b60008212156106825760405163ef147de160e01b815260040160405180910390fd5b610690633b9aca0083611c01565b156106ae576040516347d072bb60e11b815260040160405180910390fd5b6001600160a01b0383166000908152609b6020526040812054906106d28483611c2b565b6001600160a01b0386166000818152609b60205260409081902083905551919250906000805160206126ec833981519152906107119087815260200190565b60405180910390a2846001600160a01b0316600080516020611dbe8339815191528260405161074291815260200190565b60405180910390a2610754828261157d565b925050505b92915050565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156107b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107d69190611c53565b6001600160a01b0316336001600160a01b0316146108075760405163794821ff60e01b815260040160405180910390fd5b610810816115bf565b50565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa15801561085b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061087f9190611c70565b61089c57604051631d77d47760e21b815260040160405180910390fd5b606654818116146108c05760405163c61dca5d60e01b815260040160405180910390fd5b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b600054610100900460ff161580801561091e5750600054600160ff909116105b806109385750303b158015610938575060005460ff166001145b6109a05760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff1916600117905580156109c3576000805461ff0019166101001790555b6109cc8461164f565b6109d683836116a1565b8015610a1c576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610a6b57604051635c427cd960e01b815260040160405180910390fd5b6001600160a01b038316610a92576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b038216610ab9576040516339b190bb60e11b815260040160405180910390fd5b6000811215610adb5760405163ef147de160e01b815260040160405180910390fd5b610ae9633b9aca0082611c01565b15610b07576040516347d072bb60e11b815260040160405180910390fd5b6001600160a01b0383166000908152609b602052604081205490811215610c70576000610b3382611c92565b905080831115610bca576001600160a01b0385166000908152609b6020526040812055610b608184611cae565b9250846001600160a01b03166000805160206126ec83398151915282604051610b8b91815260200190565b60405180910390a2846001600160a01b0316600080516020611dbe8339815191526000604051610bbd91815260200190565b60405180910390a2610c6e565b6001600160a01b0385166000908152609b6020526040812054610bee908590611c2b565b6001600160a01b0387166000818152609b60205260409081902083905551919250906000805160206126ec83398151915290610c2d9087815260200190565b60405180910390a2856001600160a01b0316600080516020611dbe83398151915282604051610c5e91815260200190565b60405180910390a2505050505050565b505b6001600160a01b03848116600090815260986020526040908190205490516362483a2160e11b815285831660048201526024810185905291169063c490744290604401600060405180830381600087803b158015610ccd57600080fd5b505af1158015610ce1573d6000803e3d6000fd5b5050505050505050565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015610d33573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d579190611c70565b610d7457604051631d77d47760e21b815260040160405180910390fd5b600019606681905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b610dbb611726565b610dc5600061164f565b565b6066546000908190600190811603610df25760405163840a48d560e01b815260040160405180910390fd5b336000908152609860205260409020546001600160a01b031615610e295760405163031a852160e21b815260040160405180910390fd5b6000610e33611780565b9250505090565b606654600090600190811603610e635760405163840a48d560e01b815260040160405180910390fd5b336000908152609860205260409020546001600160a01b031680610e8c57610e89611780565b90505b6040516326d3918d60e21b81526001600160a01b03821690639b4e4634903490610ec2908b908b908b908b908b90600401611cea565b6000604051808303818588803b158015610edb57600080fd5b505af1158015610eef573d6000803e3d6000fd5b505050505050505050505050565b6001600160a01b038082166000908152609860205260408120549091168061075957610fc8836001600160a01b031660001b60405180610940016040528061090e8152602001611dde61090e9139604080516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166020820152808201919091526000606082015260800160408051601f1981840301815290829052610fad9291602001611d54565b604051602081830303815290604052805190602001206118e5565b9392505050565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461101857604051635c427cd960e01b815260040160405180910390fd5b600081121561103a5760405163ef147de160e01b815260040160405180910390fd5b611048633b9aca0082611c01565b15611066576040516347d072bb60e11b815260040160405180910390fd5b6001600160a01b0382166000908152609b602052604081205461108a908390611d69565b905060008112156110ae5760405163ef147de160e01b815260040160405180910390fd5b6001600160a01b0383166000818152609b60205260409081902083905551600080516020611dbe833981519152906110e99084815260200190565b60405180910390a2505050565b6001600160a01b03808316600090815260986020526040902054839116331461113257604051635c427cd960e01b815260040160405180910390fd5b600260c954036111845760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610997565b600260c9556001600160a01b0383166111b0576040516339b190bb60e11b815260040160405180910390fd5b6111be633b9aca0083611d90565b156111dc576040516347d072bb60e11b815260040160405180910390fd5b6001600160a01b0383166000908152609b6020526040812054906112008483611c2b565b6001600160a01b0386166000908152609b60205260408120829055909150611228838361157d565b905080156113905760008112156112f3576001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001663132d49678773beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac061128785611c92565b6040516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301526044820152606401600060405180830381600087803b1580156112d657600080fd5b505af11580156112ea573d6000803e3d6000fd5b50505050611390565b604051631452b9d760e11b81526001600160a01b03878116600483015273beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac06024830152604482018390527f000000000000000000000000000000000000000000000000000000000000000016906328a573ae90606401600060405180830381600087803b15801561137757600080fd5b505af115801561138b573d6000803e3d6000fd5b505050505b856001600160a01b03166000805160206126ec833981519152866040516113b991815260200190565b60405180910390a2856001600160a01b0316600080516020611dbe833981519152836040516113ea91815260200190565b60405180910390a25050600160c95550505050565b611407611726565b6001600160a01b03811661146c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610997565b6108108161164f565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156114c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114ec9190611c53565b6001600160a01b0316336001600160a01b03161461151d5760405163794821ff60e01b815260040160405180910390fd5b6066541981196066541916146115465760405163c61dca5d60e01b815260040160405180910390fd5b606681905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c906020016108f3565b600080831361159d576000821361159657506000610759565b5080610759565b600082136115b5576115ae83611c92565b9050610759565b6115ae8383611d69565b6001600160a01b0381166115e6576040516339b190bb60e11b815260040160405180910390fd5b606554604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1606580546001600160a01b0319166001600160a01b0392909216919091179055565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6065546001600160a01b03161580156116c257506001600160a01b03821615155b6116df576040516339b190bb60e11b815260040160405180910390fd5b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2611722826115bf565b5050565b6033546001600160a01b03163314610dc55760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610997565b600060996000815461179190611da4565b9091555060408051610940810190915261090e8082526000916118309183913391611dde6020830139604080516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166020820152808201919091526000606082015260800160408051601f198184030181529082905261181c9291602001611d54565b604051602081830303815290604052611941565b60405163189acdbd60e31b81523360048201529091506001600160a01b0382169063c4d66de890602401600060405180830381600087803b15801561187457600080fd5b505af1158015611888573d6000803e3d6000fd5b50503360008181526098602052604080822080546001600160a01b0319166001600160a01b038816908117909155905192945092507f21c99d0db02213c32fff5b05cf0a718ab5f858802b91498f80d82270289d856a91a3919050565b604080516001600160f81b03196020808301919091526bffffffffffffffffffffffff193060601b1660218301526035820185905260558083018590528351808403909101815260759092019092528051910120600090610fc8565b600080844710156119945760405162461bcd60e51b815260206004820152601d60248201527f437265617465323a20696e73756666696369656e742062616c616e63650000006044820152606401610997565b82516000036119e55760405162461bcd60e51b815260206004820181905260248201527f437265617465323a2062797465636f6465206c656e677468206973207a65726f6044820152606401610997565b8383516020850187f590506001600160a01b038116611a465760405162461bcd60e51b815260206004820152601960248201527f437265617465323a204661696c6564206f6e206465706c6f79000000000000006044820152606401610997565b949350505050565b6001600160a01b038116811461081057600080fd5b60008060408385031215611a7657600080fd5b8235611a8181611a4e565b946020939093013593505050565b600060208284031215611aa157600080fd5b8135610fc881611a4e565b600060208284031215611abe57600080fd5b5035919050565b600080600060608486031215611ada57600080fd5b8335611ae581611a4e565b92506020840135611af581611a4e565b929592945050506040919091013590565b600060208284031215611b1857600080fd5b813560ff81168114610fc857600080fd5b60008083601f840112611b3b57600080fd5b50813567ffffffffffffffff811115611b5357600080fd5b602083019150836020828501011115611b6b57600080fd5b9250929050565b600080600080600060608688031215611b8a57600080fd5b853567ffffffffffffffff811115611ba157600080fd5b611bad88828901611b29565b909650945050602086013567ffffffffffffffff811115611bcd57600080fd5b611bd988828901611b29565b96999598509660400135949350505050565b634e487b7160e01b600052601260045260246000fd5b600082611c1057611c10611beb565b500690565b634e487b7160e01b600052601160045260246000fd5b8082018281126000831280158216821582161715611c4b57611c4b611c15565b505092915050565b600060208284031215611c6557600080fd5b8151610fc881611a4e565b600060208284031215611c8257600080fd5b81518015158114610fc857600080fd5b6000600160ff1b8201611ca757611ca7611c15565b5060000390565b8181038181111561075957610759611c15565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b606081526000611cfe606083018789611cc1565b8281036020840152611d11818688611cc1565b9150508260408301529695505050505050565b6000815160005b81811015611d455760208185018101518683015201611d2b565b50600093019283525090919050565b6000611a46611d638386611d24565b84611d24565b8181036000831280158383131683831282161715611d8957611d89611c15565b5092915050565b600082611d9f57611d9f611beb565b500790565b600060018201611db657611db6611c15565b506001019056fed4def76d6d2bed6f14d5cd9af73cc2913d618d00edde42432e81c09bfe077098608060405260405161090e38038061090e83398101604081905261002291610460565b61002e82826000610035565b505061058a565b61003e83610100565b6040516001600160a01b038416907f1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e90600090a260008251118061007f5750805b156100fb576100f9836001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100e99190610520565b836102a360201b6100291760201c565b505b505050565b610113816102cf60201b6100551760201c565b6101725760405162461bcd60e51b815260206004820152602560248201527f455243313936373a206e657720626561636f6e206973206e6f74206120636f6e6044820152641d1c9858dd60da1b60648201526084015b60405180910390fd5b6101e6816001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156101b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101d79190610520565b6102cf60201b6100551760201c565b61024b5760405162461bcd60e51b815260206004820152603060248201527f455243313936373a20626561636f6e20696d706c656d656e746174696f6e206960448201526f1cc81b9bdd08184818dbdb9d1c9858dd60821b6064820152608401610169565b806102827fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d5060001b6102de60201b6100641760201c565b80546001600160a01b0319166001600160a01b039290921691909117905550565b60606102c883836040518060600160405280602781526020016108e7602791396102e1565b9392505050565b6001600160a01b03163b151590565b90565b6060600080856001600160a01b0316856040516102fe919061053b565b600060405180830381855af49150503d8060008114610339576040519150601f19603f3d011682016040523d82523d6000602084013e61033e565b606091505b5090925090506103508683838761035a565b9695505050505050565b606083156103c65782516103bf576001600160a01b0385163b6103bf5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610169565b50816103d0565b6103d083836103d8565b949350505050565b8151156103e85781518083602001fd5b8060405162461bcd60e51b81526004016101699190610557565b80516001600160a01b038116811461041957600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b8381101561044f578181015183820152602001610437565b838111156100f95750506000910152565b6000806040838503121561047357600080fd5b61047c83610402565b60208401519092506001600160401b038082111561049957600080fd5b818501915085601f8301126104ad57600080fd5b8151818111156104bf576104bf61041e565b604051601f8201601f19908116603f011681019083821181831017156104e7576104e761041e565b8160405282815288602084870101111561050057600080fd5b610511836020830160208801610434565b80955050505050509250929050565b60006020828403121561053257600080fd5b6102c882610402565b6000825161054d818460208701610434565b9190910192915050565b6020815260008251806020840152610576816040850160208701610434565b601f01601f19169190910160400192915050565b61034e806105996000396000f3fe60806040523661001357610011610017565b005b6100115b610027610022610067565b610100565b565b606061004e83836040518060600160405280602781526020016102f260279139610124565b9392505050565b6001600160a01b03163b151590565b90565b600061009a7fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50546001600160a01b031690565b6001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100fb9190610249565b905090565b3660008037600080366000845af43d6000803e80801561011f573d6000f35b3d6000fd5b6060600080856001600160a01b03168560405161014191906102a2565b600060405180830381855af49150503d806000811461017c576040519150601f19603f3d011682016040523d82523d6000602084013e610181565b606091505b50915091506101928683838761019c565b9695505050505050565b6060831561020d578251610206576001600160a01b0385163b6102065760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064015b60405180910390fd5b5081610217565b610217838361021f565b949350505050565b81511561022f5781518083602001fd5b8060405162461bcd60e51b81526004016101fd91906102be565b60006020828403121561025b57600080fd5b81516001600160a01b038116811461004e57600080fd5b60005b8381101561028d578181015183820152602001610275565b8381111561029c576000848401525b50505050565b600082516102b4818460208701610272565b9190910192915050565b60208152600082518060208401526102dd816040850160208701610272565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220d51e81d3bc5ed20a26aeb05dce7e825c503b2061aa78628027300c8d65b9d89a64736f6c634300080c0033416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c65644e2b791dedccd9fb30141b088cabf5c14a8912b52f59375c95c010700b8c6193a26469706673582212204aa026c6d1cc5f85ad6c8e68c9fce33f2038878c58b81920b6d2a9a7ec94c18464736f6c634300081b0033", } // EigenPodManagerABI is the input ABI used to generate the binding from. diff --git a/pkg/bindings/EigenPodManagerStorage/binding.go b/pkg/bindings/EigenPodManagerStorage/binding.go index 446bf1a74..6b3ba1371 100644 --- a/pkg/bindings/EigenPodManagerStorage/binding.go +++ b/pkg/bindings/EigenPodManagerStorage/binding.go @@ -31,7 +31,7 @@ var ( // EigenPodManagerStorageMetaData contains all meta data concerning the EigenPodManagerStorage contract. var EigenPodManagerStorageMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"function\",\"name\":\"addShares\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"beaconChainETHStrategy\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"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\":\"numPods\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ownerToPod\",\"inputs\":[{\"name\":\"\",\"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\":\"podOwnerShares\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"int256\",\"internalType\":\"int256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"recordBeaconChainETHBalanceUpdate\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"sharesDelta\",\"type\":\"int256\",\"internalType\":\"int256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeShares\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setPauserRegistry\",\"inputs\":[{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"slasher\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractISlasher\"}],\"stateMutability\":\"view\"},{\"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\":\"strategyManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawSharesAsTokens\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destination\",\"type\":\"address\",\"internalType\":\"address\"},{\"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\":\"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\":\"PauserRegistrySet\",\"inputs\":[{\"name\":\"pauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PodDeployed\",\"inputs\":[{\"name\":\"eigenPod\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PodSharesUpdated\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"sharesDelta\",\"type\":\"int256\",\"indexed\":false,\"internalType\":\"int256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false}]", + ABI: "[{\"type\":\"function\",\"name\":\"addShares\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"beaconChainETHStrategy\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"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\":\"numPods\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ownerToPod\",\"inputs\":[{\"name\":\"\",\"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\":\"podOwnerShares\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"int256\",\"internalType\":\"int256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"recordBeaconChainETHBalanceUpdate\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"sharesDelta\",\"type\":\"int256\",\"internalType\":\"int256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeShares\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setPauserRegistry\",\"inputs\":[{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"slasher\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractISlasher\"}],\"stateMutability\":\"view\"},{\"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\":\"strategyManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawSharesAsTokens\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destination\",\"type\":\"address\",\"internalType\":\"address\"},{\"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\":\"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\":\"PauserRegistrySet\",\"inputs\":[{\"name\":\"pauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PodDeployed\",\"inputs\":[{\"name\":\"eigenPod\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PodSharesUpdated\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"sharesDelta\",\"type\":\"int256\",\"indexed\":false,\"internalType\":\"int256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"CurrentlyPaused\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"EigenPodAlreadyExists\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNewPausedStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyPauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnpauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SharesNegative\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SharesNotMultipleOfGwei\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UnauthorizedCaller\",\"inputs\":[]}]", } // EigenPodManagerStorageABI is the input ABI used to generate the binding from. diff --git a/pkg/bindings/EigenPodStorage/binding.go b/pkg/bindings/EigenPodStorage/binding.go index 70640763e..4fad640ec 100644 --- a/pkg/bindings/EigenPodStorage/binding.go +++ b/pkg/bindings/EigenPodStorage/binding.go @@ -72,7 +72,7 @@ type IEigenPodValidatorInfo struct { // EigenPodStorageMetaData contains all meta data concerning the EigenPodStorage contract. var EigenPodStorageMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"function\",\"name\":\"activeValidatorCount\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"checkpointBalanceExitedGwei\",\"inputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"currentCheckpoint\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIEigenPod.Checkpoint\",\"components\":[{\"name\":\"beaconBlockRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proofsRemaining\",\"type\":\"uint24\",\"internalType\":\"uint24\"},{\"name\":\"podBalanceGwei\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"balanceDeltasGwei\",\"type\":\"int128\",\"internalType\":\"int128\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"currentCheckpointTimestamp\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"eigenPodManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigenPodManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getParentBlockRoot\",\"inputs\":[{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"lastCheckpointTimestamp\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"podOwner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proofSubmitter\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"recoverTokens\",\"inputs\":[{\"name\":\"tokenList\",\"type\":\"address[]\",\"internalType\":\"contractIERC20[]\"},{\"name\":\"amountsToWithdraw\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setProofSubmitter\",\"inputs\":[{\"name\":\"newProofSubmitter\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"stake\",\"inputs\":[{\"name\":\"pubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"depositDataRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"startCheckpoint\",\"inputs\":[{\"name\":\"revertIfNoBalance\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"validatorPubkeyHashToInfo\",\"inputs\":[{\"name\":\"validatorPubkeyHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIEigenPod.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\":\"enumIEigenPod.VALIDATOR_STATUS\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validatorPubkeyToInfo\",\"inputs\":[{\"name\":\"validatorPubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIEigenPod.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\":\"enumIEigenPod.VALIDATOR_STATUS\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validatorStatus\",\"inputs\":[{\"name\":\"validatorPubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPod.VALIDATOR_STATUS\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validatorStatus\",\"inputs\":[{\"name\":\"pubkeyHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPod.VALIDATOR_STATUS\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"verifyCheckpointProofs\",\"inputs\":[{\"name\":\"balanceContainerProof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.BalanceContainerProof\",\"components\":[{\"name\":\"balanceContainerRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"proofs\",\"type\":\"tuple[]\",\"internalType\":\"structBeaconChainProofs.BalanceProof[]\",\"components\":[{\"name\":\"pubkeyHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"balanceRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"verifyStaleBalance\",\"inputs\":[{\"name\":\"beaconTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"stateRootProof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.StateRootProof\",\"components\":[{\"name\":\"beaconStateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"proof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.ValidatorProof\",\"components\":[{\"name\":\"validatorFields\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"verifyWithdrawalCredentials\",\"inputs\":[{\"name\":\"beaconTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"stateRootProof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.StateRootProof\",\"components\":[{\"name\":\"beaconStateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"validatorIndices\",\"type\":\"uint40[]\",\"internalType\":\"uint40[]\"},{\"name\":\"validatorFieldsProofs\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"validatorFields\",\"type\":\"bytes32[][]\",\"internalType\":\"bytes32[][]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawRestakedBeaconChainETH\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawableRestakedExecutionLayerGwei\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"CheckpointCreated\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"beaconBlockRoot\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validatorCount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"CheckpointFinalized\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"totalShareDeltaWei\",\"type\":\"int256\",\"indexed\":false,\"internalType\":\"int256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"EigenPodStaked\",\"inputs\":[{\"name\":\"pubkey\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"NonBeaconChainETHReceived\",\"inputs\":[{\"name\":\"amountReceived\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ProofSubmitterUpdated\",\"inputs\":[{\"name\":\"prevProofSubmitter\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newProofSubmitter\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RestakedBeaconChainETHWithdrawn\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorBalanceUpdated\",\"inputs\":[{\"name\":\"validatorIndex\",\"type\":\"uint40\",\"indexed\":false,\"internalType\":\"uint40\"},{\"name\":\"balanceTimestamp\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"newValidatorBalanceGwei\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorCheckpointed\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorIndex\",\"type\":\"uint40\",\"indexed\":true,\"internalType\":\"uint40\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorRestaked\",\"inputs\":[{\"name\":\"validatorIndex\",\"type\":\"uint40\",\"indexed\":false,\"internalType\":\"uint40\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorWithdrawn\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorIndex\",\"type\":\"uint40\",\"indexed\":true,\"internalType\":\"uint40\"}],\"anonymous\":false}]", + 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\":\"structIEigenPod.Checkpoint\",\"components\":[{\"name\":\"beaconBlockRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proofsRemaining\",\"type\":\"uint24\",\"internalType\":\"uint24\"},{\"name\":\"podBalanceGwei\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"balanceDeltasGwei\",\"type\":\"int128\",\"internalType\":\"int128\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"currentCheckpointTimestamp\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"eigenPodManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigenPodManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getParentBlockRoot\",\"inputs\":[{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"lastCheckpointTimestamp\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"podOwner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proofSubmitter\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"recoverTokens\",\"inputs\":[{\"name\":\"tokenList\",\"type\":\"address[]\",\"internalType\":\"contractIERC20[]\"},{\"name\":\"amountsToWithdraw\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setProofSubmitter\",\"inputs\":[{\"name\":\"newProofSubmitter\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"stake\",\"inputs\":[{\"name\":\"pubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"depositDataRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"startCheckpoint\",\"inputs\":[{\"name\":\"revertIfNoBalance\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"validatorPubkeyHashToInfo\",\"inputs\":[{\"name\":\"validatorPubkeyHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIEigenPod.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\":\"enumIEigenPod.VALIDATOR_STATUS\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validatorPubkeyToInfo\",\"inputs\":[{\"name\":\"validatorPubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIEigenPod.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\":\"enumIEigenPod.VALIDATOR_STATUS\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validatorStatus\",\"inputs\":[{\"name\":\"validatorPubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPod.VALIDATOR_STATUS\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validatorStatus\",\"inputs\":[{\"name\":\"pubkeyHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPod.VALIDATOR_STATUS\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"verifyCheckpointProofs\",\"inputs\":[{\"name\":\"balanceContainerProof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.BalanceContainerProof\",\"components\":[{\"name\":\"balanceContainerRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"proofs\",\"type\":\"tuple[]\",\"internalType\":\"structBeaconChainProofs.BalanceProof[]\",\"components\":[{\"name\":\"pubkeyHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"balanceRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"verifyStaleBalance\",\"inputs\":[{\"name\":\"beaconTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"stateRootProof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.StateRootProof\",\"components\":[{\"name\":\"beaconStateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"proof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.ValidatorProof\",\"components\":[{\"name\":\"validatorFields\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"verifyWithdrawalCredentials\",\"inputs\":[{\"name\":\"beaconTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"stateRootProof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.StateRootProof\",\"components\":[{\"name\":\"beaconStateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"validatorIndices\",\"type\":\"uint40[]\",\"internalType\":\"uint40[]\"},{\"name\":\"validatorFieldsProofs\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"validatorFields\",\"type\":\"bytes32[][]\",\"internalType\":\"bytes32[][]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawRestakedBeaconChainETH\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawableRestakedExecutionLayerGwei\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"CheckpointCreated\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"beaconBlockRoot\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validatorCount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"CheckpointFinalized\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"totalShareDeltaWei\",\"type\":\"int256\",\"indexed\":false,\"internalType\":\"int256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"EigenPodStaked\",\"inputs\":[{\"name\":\"pubkey\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"NonBeaconChainETHReceived\",\"inputs\":[{\"name\":\"amountReceived\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ProofSubmitterUpdated\",\"inputs\":[{\"name\":\"prevProofSubmitter\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newProofSubmitter\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RestakedBeaconChainETHWithdrawn\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorBalanceUpdated\",\"inputs\":[{\"name\":\"validatorIndex\",\"type\":\"uint40\",\"indexed\":false,\"internalType\":\"uint40\"},{\"name\":\"balanceTimestamp\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"newValidatorBalanceGwei\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorCheckpointed\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorIndex\",\"type\":\"uint40\",\"indexed\":true,\"internalType\":\"uint40\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorRestaked\",\"inputs\":[{\"name\":\"validatorIndex\",\"type\":\"uint40\",\"indexed\":false,\"internalType\":\"uint40\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorWithdrawn\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorIndex\",\"type\":\"uint40\",\"indexed\":true,\"internalType\":\"uint40\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AmountMustBeMultipleOfGwei\",\"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\":\"InputAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputArrayLengthMismatch\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InsufficientWithdrawableBalance\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidEIP4788Response\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidPubKeyLength\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MsgValueNot32ETH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NoActiveCheckpoint\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NoBalanceToCheckpoint\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"TimestampOutOfRange\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UnauthorizedCaller\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ValidatorInactiveOnBeaconChain\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ValidatorIsExitingBeaconChain\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ValidatorNotActiveInPod\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ValidatorNotSlashedOnBeaconChain\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"WithdrawCredentialsNotForEigenPod\",\"inputs\":[]}]", } // EigenPodStorageABI is the input ABI used to generate the binding from. diff --git a/pkg/bindings/EigenStrategy/binding.go b/pkg/bindings/EigenStrategy/binding.go index 2070a2d17..d3ba64dc8 100644 --- a/pkg/bindings/EigenStrategy/binding.go +++ b/pkg/bindings/EigenStrategy/binding.go @@ -31,8 +31,8 @@ var ( // EigenStrategyMetaData contains all meta data concerning the EigenStrategy contract. var EigenStrategyMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_strategyManager\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"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\":\"_underlyingToken\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_EIGEN\",\"type\":\"address\",\"internalType\":\"contractIEigen\"},{\"name\":\"_bEIGEN\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"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\":\"setPauserRegistry\",\"inputs\":[{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"shares\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"sharesToUnderlying\",\"inputs\":[{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"sharesToUnderlyingView\",\"inputs\":[{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"strategyManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"totalShares\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToShares\",\"inputs\":[{\"name\":\"amountUnderlying\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToSharesView\",\"inputs\":[{\"name\":\"amountUnderlying\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToken\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"userUnderlying\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"userUnderlyingView\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"withdraw\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"ExchangeRateEmitted\",\"inputs\":[{\"name\":\"rate\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PauserRegistrySet\",\"inputs\":[{\"name\":\"pauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"}],\"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}]", - Bin: "0x60a06040523480156200001157600080fd5b5060405162001dc338038062001dc3833981016040819052620000349162000116565b6001600160a01b038116608052806200004c62000054565b505062000148565b600054610100900460ff1615620000c15760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101562000114576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6000602082840312156200012957600080fd5b81516001600160a01b03811681146200014157600080fd5b9392505050565b608051611c4a62000179600039600081816101af015281816105ac01528181610ad40152610b9f0152611c4a6000f3fe608060405234801561001057600080fd5b506004361061014d5760003560e01c80637a8b2637116100c3578063ce7c2ac21161007c578063ce7c2ac2146102da578063d9caed12146102ed578063e3dae51c14610300578063f3e7387514610313578063fabc1cbc14610326578063fdc371ce1461033957600080fd5b80637a8b263714610260578063886f1195146102735780638c8710191461028c5780638f6a62401461029f578063ab5921e1146102b2578063c0c53b8b146102c757600080fd5b806347e7ef241161011557806347e7ef24146101e8578063485cc955146101fb578063553ca5f81461020e578063595c6a67146102215780635ac86ab7146102295780635c975abb1461025857600080fd5b806310d67a2f14610152578063136439dd146101675780632495a5991461017a57806339b70e38146101aa5780633a98ef39146101d1575b600080fd5b61016561016036600461181e565b61034c565b005b61016561017536600461183b565b610408565b60325461018d906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b61018d7f000000000000000000000000000000000000000000000000000000000000000081565b6101da60335481565b6040519081526020016101a1565b6101da6101f6366004611854565b61054c565b610165610209366004611880565b610790565b6101da61021c36600461181e565b61085e565b610165610872565b6102486102373660046118c8565b6001805460ff9092161b9081161490565b60405190151581526020016101a1565b6001546101da565b6101da61026e36600461183b565b61093e565b60005461018d906201000090046001600160a01b031681565b6101da61029a36600461183b565b610989565b6101da6102ad36600461181e565b610994565b6102ba6109a2565b6040516101a19190611911565b6101656102d5366004611944565b6109c2565b6101da6102e836600461181e565b610aac565b6101656102fb36600461198f565b610b41565b6101da61030e36600461183b565b610d27565b6101da61032136600461183b565b610d60565b61016561033436600461183b565b610d6b565b60645461018d906001600160a01b031681565b600060029054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561039f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103c391906119d0565b6001600160a01b0316336001600160a01b0316146103fc5760405162461bcd60e51b81526004016103f3906119ed565b60405180910390fd5b61040581610ec7565b50565b60005460405163237dfb4760e11b8152336004820152620100009091046001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610455573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104799190611a37565b6104955760405162461bcd60e51b81526004016103f390611a59565b6001548181161461050e5760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c697479000000000000000060648201526084016103f3565b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b600180546000918291811614156105a15760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b60448201526064016103f3565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146106195760405162461bcd60e51b815260206004820181905260248201527f5374726174656779426173652e6f6e6c7953747261746567794d616e6167657260448201526064016103f3565b6106238484610fcc565b60335460006106346103e883611ab7565b905060006103e86106436110e0565b61064d9190611ab7565b9050600061065b8783611acf565b9050806106688489611ae6565b6106729190611b05565b9550856106d85760405162461bcd60e51b815260206004820152602e60248201527f5374726174656779426173652e6465706f7369743a206e65775368617265732060448201526d63616e6e6f74206265207a65726f60901b60648201526084016103f3565b6106e28685611ab7565b60338190556f4b3b4ca85a86c47a098a223fffffffff101561076c5760405162461bcd60e51b815260206004820152603c60248201527f5374726174656779426173652e6465706f7369743a20746f74616c536861726560448201527f73206578636565647320604d41585f544f54414c5f534841524553600000000060648201526084016103f3565b610785826103e86033546107809190611ab7565b611152565b505050505092915050565b600054610100900460ff16158080156107b05750600054600160ff909116105b806107ca5750303b1580156107ca575060005460ff166001145b6107e65760405162461bcd60e51b81526004016103f390611b27565b6000805460ff191660011790558015610809576000805461ff0019166101001790555b61081383836111a6565b8015610859576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b600061086c61026e83610aac565b92915050565b60005460405163237dfb4760e11b8152336004820152620100009091046001600160a01b0316906346fbf68e90602401602060405180830381865afa1580156108bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108e39190611a37565b6108ff5760405162461bcd60e51b81526004016103f390611a59565b600019600181905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b6000806103e86033546109519190611ab7565b905060006103e86109606110e0565b61096a9190611ab7565b9050816109778583611ae6565b6109819190611b05565b949350505050565b600061086c82610d27565b600061086c61032183610aac565b60606040518060800160405280604d8152602001611bc8604d9139905090565b600054610100900460ff16158080156109e25750600054600160ff909116105b806109fc5750303b1580156109fc575060005460ff166001145b610a185760405162461bcd60e51b81526004016103f390611b27565b6000805460ff191660011790558015610a3b576000805461ff0019166101001790555b606480546001600160a01b0319166001600160a01b038616179055610a6083836111a6565b8015610aa6576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b604051633d3f06c960e11b81526001600160a01b0382811660048301523060248301526000917f000000000000000000000000000000000000000000000000000000000000000090911690637a7e0d9290604401602060405180830381865afa158015610b1d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061086c9190611b75565b6001805460029081161415610b945760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b60448201526064016103f3565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610c0c5760405162461bcd60e51b815260206004820181905260248201527f5374726174656779426173652e6f6e6c7953747261746567794d616e6167657260448201526064016103f3565b610c178484846112f1565b60335480831115610ca65760405162461bcd60e51b815260206004820152604d60248201527f5374726174656779426173652e77697468647261773a20616d6f756e7453686160448201527f726573206d757374206265206c657373207468616e206f7220657175616c207460648201526c6f20746f74616c53686172657360981b608482015260a4016103f3565b6000610cb46103e883611ab7565b905060006103e8610cc36110e0565b610ccd9190611ab7565b9050600082610cdc8784611ae6565b610ce69190611b05565b9050610cf28685611acf565b603355610d12610d028284611acf565b6103e86033546107809190611ab7565b610d1d88888361138c565b5050505050505050565b6000806103e8603354610d3a9190611ab7565b905060006103e8610d496110e0565b610d539190611ab7565b9050806109778386611ae6565b600061086c8261093e565b600060029054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610dbe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610de291906119d0565b6001600160a01b0316336001600160a01b031614610e125760405162461bcd60e51b81526004016103f3906119ed565b600154198119600154191614610e905760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c697479000000000000000060648201526084016103f3565b600181905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c90602001610541565b6001600160a01b038116610f555760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a4016103f3565b600054604080516001600160a01b03620100009093048316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1600080546001600160a01b03909216620100000262010000600160b01b0319909216919091179055565b6032546001600160a01b0383811691161480610ff557506064546001600160a01b038381169116145b6110675760405162461bcd60e51b815260206004820152603760248201527f456967656e53747261746567792e6465706f7369743a2043616e206f6e6c792060448201527f6465706f7369742062454947454e206f7220454947454e00000000000000000060648201526084016103f3565b6064546001600160a01b03838116911614156110dc57606454604051636f074d1f60e11b8152600481018390526001600160a01b039091169063de0e9a3e90602401600060405180830381600087803b1580156110c357600080fd5b505af11580156110d7573d6000803e3d6000fd5b505050505b5050565b6032546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015611129573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061114d9190611b75565b905090565b7fd2494f3479e5da49d386657c292c610b5b01df313d07c62eb0cfa49924a31be88161118684670de0b6b3a7640000611ae6565b6111909190611b05565b6040519081526020015b60405180910390a15050565b600054610100900460ff166112115760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b60648201526084016103f3565b603280546001600160a01b0319166001600160a01b03841617905561123781600061148d565b7f1c540707b00eb5427b6b774fc799d756516a54aee108b64b327acc55af557507603260009054906101000a90046001600160a01b0316836001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156112ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112d09190611b8e565b604080516001600160a01b03909316835260ff90911660208301520161119a565b6032546001600160a01b038381169116148061131a57506064546001600160a01b038381169116145b6108595760405162461bcd60e51b815260206004820152603960248201527f456967656e53747261746567792e77697468647261773a2043616e206f6e6c7960448201527f2077697468647261772062454947454e206f7220454947454e0000000000000060648201526084016103f3565b6064546001600160a01b03838116911614156114795760325460405163095ea7b360e01b81526001600160a01b038481166004830152602482018490529091169063095ea7b3906044016020604051808303816000875af11580156113f5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114199190611a37565b50606454604051630ea598cb60e41b8152600481018390526001600160a01b039091169063ea598cb090602401600060405180830381600087803b15801561146057600080fd5b505af1158015611474573d6000803e3d6000fd5b505050505b6108596001600160a01b0383168483611579565b6000546201000090046001600160a01b03161580156114b457506001600160a01b03821615155b6115365760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a4016103f3565b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a26110dc82610ec7565b604080516001600160a01b03848116602483015260448083018590528351808403909101815260649092018352602080830180516001600160e01b031663a9059cbb60e01b17905283518085019094528084527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65649084015261085992869291600091611609918516908490611686565b80519091501561085957808060200190518101906116279190611a37565b6108595760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016103f3565b6060611695848460008561169f565b90505b9392505050565b6060824710156117005760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016103f3565b6001600160a01b0385163b6117575760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016103f3565b600080866001600160a01b031685876040516117739190611bab565b60006040518083038185875af1925050503d80600081146117b0576040519150601f19603f3d011682016040523d82523d6000602084013e6117b5565b606091505b50915091506117c58282866117d0565b979650505050505050565b606083156117df575081611698565b8251156117ef5782518084602001fd5b8160405162461bcd60e51b81526004016103f39190611911565b6001600160a01b038116811461040557600080fd5b60006020828403121561183057600080fd5b813561169881611809565b60006020828403121561184d57600080fd5b5035919050565b6000806040838503121561186757600080fd5b823561187281611809565b946020939093013593505050565b6000806040838503121561189357600080fd5b823561189e81611809565b915060208301356118ae81611809565b809150509250929050565b60ff8116811461040557600080fd5b6000602082840312156118da57600080fd5b8135611698816118b9565b60005b838110156119005781810151838201526020016118e8565b83811115610aa65750506000910152565b60208152600082518060208401526119308160408501602087016118e5565b601f01601f19169190910160400192915050565b60008060006060848603121561195957600080fd5b833561196481611809565b9250602084013561197481611809565b9150604084013561198481611809565b809150509250925092565b6000806000606084860312156119a457600080fd5b83356119af81611809565b925060208401356119bf81611809565b929592945050506040919091013590565b6000602082840312156119e257600080fd5b815161169881611809565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b600060208284031215611a4957600080fd5b8151801515811461169857600080fd5b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b60008219821115611aca57611aca611aa1565b500190565b600082821015611ae157611ae1611aa1565b500390565b6000816000190483118215151615611b0057611b00611aa1565b500290565b600082611b2257634e487b7160e01b600052601260045260246000fd5b500490565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b600060208284031215611b8757600080fd5b5051919050565b600060208284031215611ba057600080fd5b8151611698816118b9565b60008251611bbd8184602087016118e5565b919091019291505056fe4261736520537472617465677920696d706c656d656e746174696f6e20746f20696e68657269742066726f6d20666f72206d6f726520636f6d706c657820696d706c656d656e746174696f6e73a26469706673582212209f0a5f3b361d82437f0c321794900a7aead1b85f77f12d7038cbafbf9ebeb3f164736f6c634300080c0033", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_strategyManager\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"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\":\"_underlyingToken\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_EIGEN\",\"type\":\"address\",\"internalType\":\"contractIEigen\"},{\"name\":\"_bEIGEN\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"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\":\"setPauserRegistry\",\"inputs\":[{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"shares\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"sharesToUnderlying\",\"inputs\":[{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"sharesToUnderlyingView\",\"inputs\":[{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"strategyManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"totalShares\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToShares\",\"inputs\":[{\"name\":\"amountUnderlying\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToSharesView\",\"inputs\":[{\"name\":\"amountUnderlying\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToken\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"userUnderlying\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"userUnderlyingView\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"withdraw\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"ExchangeRateEmitted\",\"inputs\":[{\"name\":\"rate\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PauserRegistrySet\",\"inputs\":[{\"name\":\"pauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyTokenSet\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIERC20\"},{\"name\":\"decimals\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"BalanceExceedsMaxTotalDeposits\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CurrentlyPaused\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNewPausedStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxPerDepositExceedsMax\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NewSharesZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyPauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnderlyingToken\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnpauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"TotalSharesExceedsMax\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UnauthorizedCaller\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"WithdrawalAmountExceedsTotalDeposits\",\"inputs\":[]}]", + Bin: "0x60a060405234801561001057600080fd5b5060405161193638038061193683398101604081905261002f9161010c565b6001600160a01b0381166080528061004561004c565b505061013c565b600054610100900460ff16156100b85760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101561010a576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b60006020828403121561011e57600080fd5b81516001600160a01b038116811461013557600080fd5b9392505050565b6080516117ca61016c600039600081816101af015281816105240152818161098f0152610a2e01526117ca6000f3fe608060405234801561001057600080fd5b506004361061014d5760003560e01c80637a8b2637116100c3578063ce7c2ac21161007c578063ce7c2ac2146102da578063d9caed12146102ed578063e3dae51c14610300578063f3e7387514610313578063fabc1cbc14610326578063fdc371ce1461033957600080fd5b80637a8b263714610260578063886f1195146102735780638c8710191461028c5780638f6a62401461029f578063ab5921e1146102b2578063c0c53b8b146102c757600080fd5b806347e7ef241161011557806347e7ef24146101e8578063485cc955146101fb578063553ca5f81461020e578063595c6a67146102215780635ac86ab7146102295780635c975abb1461025857600080fd5b806310d67a2f14610152578063136439dd146101675780632495a5991461017a57806339b70e38146101aa5780633a98ef39146101d1575b600080fd5b610165610160366004611449565b61034c565b005b610165610175366004611466565b610400565b60325461018d906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b61018d7f000000000000000000000000000000000000000000000000000000000000000081565b6101da60335481565b6040519081526020016101a1565b6101da6101f636600461147f565b6104f0565b6101656102093660046114ab565b610641565b6101da61021c366004611449565b610718565b61016561072c565b6102486102373660046114f3565b6001805460ff9092161b9081161490565b60405190151581526020016101a1565b6001546101da565b6101da61026e366004611466565b6107f9565b60005461018d906201000090046001600160a01b031681565b6101da61029a366004611466565b610844565b6101da6102ad366004611449565b61084f565b6102ba61085d565b6040516101a19190611534565b6101656102d5366004611567565b61087d565b6101da6102e8366004611449565b610967565b6101656102fb3660046115b2565b6109fc565b6101da61030e366004611466565b610b1c565b6101da610321366004611466565b610b55565b610165610334366004611466565b610b60565b60645461018d906001600160a01b031681565b600060029054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561039f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103c391906115f3565b6001600160a01b0316336001600160a01b0316146103f45760405163794821ff60e01b815260040160405180910390fd5b6103fd81610c68565b50565b60005460405163237dfb4760e11b8152336004820152620100009091046001600160a01b0316906346fbf68e90602401602060405180830381865afa15801561044d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104719190611610565b61048e57604051631d77d47760e21b815260040160405180910390fd5b600154818116146104b25760405163c61dca5d60e01b815260040160405180910390fd5b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b6001805460009182918116036105195760405163840a48d560e01b815260040160405180910390fd5b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461056257604051635c427cd960e01b815260040160405180910390fd5b61056c8484610d06565b603354600061057d6103e883611648565b905060006103e861058c610dc5565b6105969190611648565b905060006105a4878361165b565b9050806105b1848961166e565b6105bb9190611685565b9550856000036105de57604051630c392ed360e11b815260040160405180910390fd5b6105e88685611648565b60338190556f4b3b4ca85a86c47a098a223fffffffff101561061d57604051632f14e8a360e11b815260040160405180910390fd5b610636826103e86033546106319190611648565b610e37565b505050505092915050565b600054610100900460ff16158080156106615750600054600160ff909116105b8061067b5750303b15801561067b575060005460ff166001145b6106a05760405162461bcd60e51b8152600401610697906116a7565b60405180910390fd5b6000805460ff1916600117905580156106c3576000805461ff0019166101001790555b6106cd8383610e8b565b8015610713576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b600061072661026e83610967565b92915050565b60005460405163237dfb4760e11b8152336004820152620100009091046001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610779573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061079d9190611610565b6107ba57604051631d77d47760e21b815260040160405180910390fd5b600019600181905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b6000806103e860335461080c9190611648565b905060006103e861081b610dc5565b6108259190611648565b905081610832858361166e565b61083c9190611685565b949350505050565b600061072682610b1c565b600061072661032183610967565b60606040518060800160405280604d8152602001611748604d9139905090565b600054610100900460ff161580801561089d5750600054600160ff909116105b806108b75750303b1580156108b7575060005460ff166001145b6108d35760405162461bcd60e51b8152600401610697906116a7565b6000805460ff1916600117905580156108f6576000805461ff0019166101001790555b606480546001600160a01b0319166001600160a01b03861617905561091b8383610e8b565b8015610961576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b604051633d3f06c960e11b81526001600160a01b0382811660048301523060248301526000917f000000000000000000000000000000000000000000000000000000000000000090911690637a7e0d9290604401602060405180830381865afa1580156109d8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061072691906116f5565b60018054600290811603610a235760405163840a48d560e01b815260040160405180910390fd5b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610a6c57604051635c427cd960e01b815260040160405180910390fd5b610a77848484610fd6565b60335480831115610a9b57604051630b469df360e41b815260040160405180910390fd5b6000610aa96103e883611648565b905060006103e8610ab8610dc5565b610ac29190611648565b9050600082610ad1878461166e565b610adb9190611685565b9050610ae7868561165b565b603355610b07610af7828461165b565b6103e86033546106319190611648565b610b1288888361101c565b5050505050505050565b6000806103e8603354610b2f9190611648565b905060006103e8610b3e610dc5565b610b489190611648565b905080610832838661166e565b6000610726826107f9565b600060029054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610bb3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bd791906115f3565b6001600160a01b0316336001600160a01b031614610c085760405163794821ff60e01b815260040160405180910390fd5b600154198119600154191614610c315760405163c61dca5d60e01b815260040160405180910390fd5b600181905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c906020016104e5565b6001600160a01b038116610c8f576040516339b190bb60e11b815260040160405180910390fd5b600054604080516001600160a01b03620100009093048316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1600080546001600160a01b03909216620100000262010000600160b01b0319909216919091179055565b6032546001600160a01b0383811691161480610d2f57506064546001600160a01b038381169116145b610d4c57604051630312abdd60e61b815260040160405180910390fd5b6064546001600160a01b0390811690831603610dc157606454604051636f074d1f60e11b8152600481018390526001600160a01b039091169063de0e9a3e90602401600060405180830381600087803b158015610da857600080fd5b505af1158015610dbc573d6000803e3d6000fd5b505050505b5050565b6032546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015610e0e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e3291906116f5565b905090565b7fd2494f3479e5da49d386657c292c610b5b01df313d07c62eb0cfa49924a31be881610e6b84670de0b6b3a764000061166e565b610e759190611685565b6040519081526020015b60405180910390a15050565b600054610100900460ff16610ef65760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401610697565b603280546001600160a01b0319166001600160a01b038416179055610f1c81600061111d565b7f1c540707b00eb5427b6b774fc799d756516a54aee108b64b327acc55af557507603260009054906101000a90046001600160a01b0316836001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f91573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fb5919061170e565b604080516001600160a01b03909316835260ff909116602083015201610e7f565b6032546001600160a01b0383811691161480610fff57506064546001600160a01b038381169116145b61071357604051630312abdd60e61b815260040160405180910390fd5b6064546001600160a01b03908116908316036111095760325460405163095ea7b360e01b81526001600160a01b038481166004830152602482018490529091169063095ea7b3906044016020604051808303816000875af1158015611085573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110a99190611610565b50606454604051630ea598cb60e41b8152600481018390526001600160a01b039091169063ea598cb090602401600060405180830381600087803b1580156110f057600080fd5b505af1158015611104573d6000803e3d6000fd5b505050505b6107136001600160a01b03831684836111a4565b6000546201000090046001600160a01b031615801561114457506001600160a01b03821615155b611161576040516339b190bb60e11b815260040160405180910390fd5b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2610dc182610c68565b604080516001600160a01b03848116602483015260448083018590528351808403909101815260649092018352602080830180516001600160e01b031663a9059cbb60e01b17905283518085019094528084527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c656490840152610713928692916000916112349185169084906112b1565b80519091501561071357808060200190518101906112529190611610565b6107135760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610697565b60606112c084846000856112ca565b90505b9392505050565b60608247101561132b5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610697565b6001600160a01b0385163b6113825760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610697565b600080866001600160a01b0316858760405161139e919061172b565b60006040518083038185875af1925050503d80600081146113db576040519150601f19603f3d011682016040523d82523d6000602084013e6113e0565b606091505b50915091506113f08282866113fb565b979650505050505050565b6060831561140a5750816112c3565b82511561141a5782518084602001fd5b8160405162461bcd60e51b81526004016106979190611534565b6001600160a01b03811681146103fd57600080fd5b60006020828403121561145b57600080fd5b81356112c381611434565b60006020828403121561147857600080fd5b5035919050565b6000806040838503121561149257600080fd5b823561149d81611434565b946020939093013593505050565b600080604083850312156114be57600080fd5b82356114c981611434565b915060208301356114d981611434565b809150509250929050565b60ff811681146103fd57600080fd5b60006020828403121561150557600080fd5b81356112c3816114e4565b60005b8381101561152b578181015183820152602001611513565b50506000910152565b6020815260008251806020840152611553816040850160208701611510565b601f01601f19169190910160400192915050565b60008060006060848603121561157c57600080fd5b833561158781611434565b9250602084013561159781611434565b915060408401356115a781611434565b809150509250925092565b6000806000606084860312156115c757600080fd5b83356115d281611434565b925060208401356115e281611434565b929592945050506040919091013590565b60006020828403121561160557600080fd5b81516112c381611434565b60006020828403121561162257600080fd5b815180151581146112c357600080fd5b634e487b7160e01b600052601160045260246000fd5b8082018082111561072657610726611632565b8181038181111561072657610726611632565b808202811582820484141761072657610726611632565b6000826116a257634e487b7160e01b600052601260045260246000fd5b500490565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b60006020828403121561170757600080fd5b5051919050565b60006020828403121561172057600080fd5b81516112c3816114e4565b6000825161173d818460208701611510565b919091019291505056fe4261736520537472617465677920696d706c656d656e746174696f6e20746f20696e68657269742066726f6d20666f72206d6f726520636f6d706c657820696d706c656d656e746174696f6e73a26469706673582212201c9bcd1118dfa77a854462121c21abc1fd0d551cdad5b0b9cebf3b539d28856464736f6c634300081b0033", } // EigenStrategyABI is the input ABI used to generate the binding from. diff --git a/pkg/bindings/Endian/binding.go b/pkg/bindings/Endian/binding.go index b9f7ef348..d9bafb326 100644 --- a/pkg/bindings/Endian/binding.go +++ b/pkg/bindings/Endian/binding.go @@ -32,7 +32,7 @@ var ( // EndianMetaData contains all meta data concerning the Endian contract. var EndianMetaData = &bind.MetaData{ ABI: "[]", - Bin: "0x60566037600b82828239805160001a607314602a57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea2646970667358221220731750cc39c1118f2ee5b7230bba50321789b805b1844817687dc7c3931262f964736f6c634300080c0033", + Bin: "0x60566037600b82828239805160001a607314602a57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea26469706673582212200a2ff2c8640be799bf0f24e1f55349bb44ff68c1cfaf8dcdd94359a64a35fa0f64736f6c634300081b0033", } // EndianABI is the input ABI used to generate the binding from. diff --git a/pkg/bindings/IAVSDirectory/binding.go b/pkg/bindings/IAVSDirectory/binding.go index 6ee8f3ce0..20c44ca22 100644 --- a/pkg/bindings/IAVSDirectory/binding.go +++ b/pkg/bindings/IAVSDirectory/binding.go @@ -38,7 +38,7 @@ type ISignatureUtilsSignatureWithSaltAndExpiry struct { // IAVSDirectoryMetaData contains all meta data concerning the IAVSDirectory contract. var IAVSDirectoryMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"function\",\"name\":\"OPERATOR_AVS_REGISTRATION_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"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\":\"deregisterOperatorFromAVS\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"operatorSaltIsSpent\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"registerOperatorToAVS\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSignature\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtils.SignatureWithSaltAndExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateAVSMetadataURI\",\"inputs\":[{\"name\":\"metadataURI\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AVSMetadataURIUpdated\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorAVSRegistrationStatusUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"status\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"enumIAVSDirectory.OperatorAVSRegistrationStatus\"}],\"anonymous\":false}]", + ABI: "[{\"type\":\"function\",\"name\":\"OPERATOR_AVS_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\":\"deregisterOperatorFromAVS\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"operatorSaltIsSpent\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"registerOperatorToAVS\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSignature\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtils.SignatureWithSaltAndExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateAVSMetadataURI\",\"inputs\":[{\"name\":\"metadataURI\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AVSMetadataURIUpdated\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorAVSRegistrationStatusUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"status\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"enumIAVSDirectory.OperatorAVSRegistrationStatus\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"OperatorAlreadyRegistered\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OperatorDoesNotExist\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OperatorNotRegistered\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SignatureExpired\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SignatureSaltSpent\",\"inputs\":[]}]", } // IAVSDirectoryABI is the input ABI used to generate the binding from. diff --git a/pkg/bindings/IDelegationManager/binding.go b/pkg/bindings/IDelegationManager/binding.go index 3d9a84301..2f5320df7 100644 --- a/pkg/bindings/IDelegationManager/binding.go +++ b/pkg/bindings/IDelegationManager/binding.go @@ -62,7 +62,7 @@ type ISignatureUtilsSignatureWithExpiry struct { // 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\":\"DOMAIN_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"STAKER_DELEGATION_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\":\"calculateCurrentStakerDelegationDigestHash\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"calculateStakerDelegationDigestHash\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_stakerNonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateWithdrawalRoot\",\"inputs\":[{\"name\":\"withdrawal\",\"type\":\"tuple\",\"internalType\":\"structIDelegationManager.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\":\"shares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"completeQueuedWithdrawal\",\"inputs\":[{\"name\":\"withdrawal\",\"type\":\"tuple\",\"internalType\":\"structIDelegationManager.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\":\"shares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]},{\"name\":\"tokens\",\"type\":\"address[]\",\"internalType\":\"contractIERC20[]\"},{\"name\":\"middlewareTimesIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"receiveAsTokens\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeQueuedWithdrawals\",\"inputs\":[{\"name\":\"withdrawals\",\"type\":\"tuple[]\",\"internalType\":\"structIDelegationManager.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\":\"shares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]},{\"name\":\"tokens\",\"type\":\"address[][]\",\"internalType\":\"contractIERC20[][]\"},{\"name\":\"middlewareTimesIndexes\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"receiveAsTokens\",\"type\":\"bool[]\",\"internalType\":\"bool[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"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\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegateTo\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"approverSignatureAndExpiry\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtils.SignatureWithExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"approverSalt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegateToBySignature\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"stakerSignatureAndExpiry\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtils.SignatureWithExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"approverSignatureAndExpiry\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtils.SignatureWithExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"approverSalt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegatedTo\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"delegationApprover\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"delegationApproverSaltIsSpent\",\"inputs\":[{\"name\":\"_delegationApprover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"domainSeparator\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"getWithdrawalDelay\",\"inputs\":[{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"increaseDelegatedShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"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\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"modifyOperatorDetails\",\"inputs\":[{\"name\":\"newOperatorDetails\",\"type\":\"tuple\",\"internalType\":\"structIDelegationManager.OperatorDetails\",\"components\":[{\"name\":\"__deprecated_earningsReceiver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegationApprover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"stakerOptOutWindowBlocks\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"operatorDetails\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIDelegationManager.OperatorDetails\",\"components\":[{\"name\":\"__deprecated_earningsReceiver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegationApprover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"stakerOptOutWindowBlocks\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"operatorShares\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"queueWithdrawals\",\"inputs\":[{\"name\":\"queuedWithdrawalParams\",\"type\":\"tuple[]\",\"internalType\":\"structIDelegationManager.QueuedWithdrawalParams[]\",\"components\":[{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"shares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registerAsOperator\",\"inputs\":[{\"name\":\"registeringOperatorDetails\",\"type\":\"tuple\",\"internalType\":\"structIDelegationManager.OperatorDetails\",\"components\":[{\"name\":\"__deprecated_earningsReceiver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegationApprover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"stakerOptOutWindowBlocks\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"metadataURI\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"stakerNonce\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"stakerOptOutWindowBlocks\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"strategyWithdrawalDelayBlocks\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"undelegate\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"withdrawalRoot\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateOperatorMetadataURI\",\"inputs\":[{\"name\":\"metadataURI\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"MinWithdrawalDelayBlocksSet\",\"inputs\":[{\"name\":\"previousValue\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"newValue\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorDetailsModified\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOperatorDetails\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIDelegationManager.OperatorDetails\",\"components\":[{\"name\":\"__deprecated_earningsReceiver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegationApprover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"stakerOptOutWindowBlocks\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"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\":\"operatorDetails\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIDelegationManager.OperatorDetails\",\"components\":[{\"name\":\"__deprecated_earningsReceiver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegationApprover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"stakerOptOutWindowBlocks\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"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\":\"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\":\"StrategyWithdrawalDelayBlocksSet\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"previousValue\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"newValue\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"WithdrawalCompleted\",\"inputs\":[{\"name\":\"withdrawalRoot\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"WithdrawalQueued\",\"inputs\":[{\"name\":\"withdrawalRoot\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"withdrawal\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIDelegationManager.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\":\"shares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]}],\"anonymous\":false}]", + ABI: "[{\"type\":\"function\",\"name\":\"DELEGATION_APPROVAL_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"DOMAIN_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"STAKER_DELEGATION_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\":\"calculateCurrentStakerDelegationDigestHash\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"calculateStakerDelegationDigestHash\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_stakerNonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateWithdrawalRoot\",\"inputs\":[{\"name\":\"withdrawal\",\"type\":\"tuple\",\"internalType\":\"structIDelegationManager.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\":\"shares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"completeQueuedWithdrawal\",\"inputs\":[{\"name\":\"withdrawal\",\"type\":\"tuple\",\"internalType\":\"structIDelegationManager.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\":\"shares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]},{\"name\":\"tokens\",\"type\":\"address[]\",\"internalType\":\"contractIERC20[]\"},{\"name\":\"middlewareTimesIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"receiveAsTokens\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeQueuedWithdrawals\",\"inputs\":[{\"name\":\"withdrawals\",\"type\":\"tuple[]\",\"internalType\":\"structIDelegationManager.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\":\"shares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]},{\"name\":\"tokens\",\"type\":\"address[][]\",\"internalType\":\"contractIERC20[][]\"},{\"name\":\"middlewareTimesIndexes\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"receiveAsTokens\",\"type\":\"bool[]\",\"internalType\":\"bool[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"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\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegateTo\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"approverSignatureAndExpiry\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtils.SignatureWithExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"approverSalt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegateToBySignature\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"stakerSignatureAndExpiry\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtils.SignatureWithExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"approverSignatureAndExpiry\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtils.SignatureWithExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"approverSalt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegatedTo\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"delegationApprover\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"delegationApproverSaltIsSpent\",\"inputs\":[{\"name\":\"_delegationApprover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"domainSeparator\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"getWithdrawalDelay\",\"inputs\":[{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"increaseDelegatedShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"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\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"modifyOperatorDetails\",\"inputs\":[{\"name\":\"newOperatorDetails\",\"type\":\"tuple\",\"internalType\":\"structIDelegationManager.OperatorDetails\",\"components\":[{\"name\":\"__deprecated_earningsReceiver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegationApprover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"stakerOptOutWindowBlocks\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"operatorDetails\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIDelegationManager.OperatorDetails\",\"components\":[{\"name\":\"__deprecated_earningsReceiver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegationApprover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"stakerOptOutWindowBlocks\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"operatorShares\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"queueWithdrawals\",\"inputs\":[{\"name\":\"queuedWithdrawalParams\",\"type\":\"tuple[]\",\"internalType\":\"structIDelegationManager.QueuedWithdrawalParams[]\",\"components\":[{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"shares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registerAsOperator\",\"inputs\":[{\"name\":\"registeringOperatorDetails\",\"type\":\"tuple\",\"internalType\":\"structIDelegationManager.OperatorDetails\",\"components\":[{\"name\":\"__deprecated_earningsReceiver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegationApprover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"stakerOptOutWindowBlocks\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"metadataURI\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"stakerNonce\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"stakerOptOutWindowBlocks\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"strategyWithdrawalDelayBlocks\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"undelegate\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"withdrawalRoot\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateOperatorMetadataURI\",\"inputs\":[{\"name\":\"metadataURI\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"MinWithdrawalDelayBlocksSet\",\"inputs\":[{\"name\":\"previousValue\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"newValue\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorDetailsModified\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOperatorDetails\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIDelegationManager.OperatorDetails\",\"components\":[{\"name\":\"__deprecated_earningsReceiver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegationApprover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"stakerOptOutWindowBlocks\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"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\":\"operatorDetails\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIDelegationManager.OperatorDetails\",\"components\":[{\"name\":\"__deprecated_earningsReceiver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegationApprover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"stakerOptOutWindowBlocks\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"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\":\"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\":\"StrategyWithdrawalDelayBlocksSet\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"previousValue\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"newValue\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"WithdrawalCompleted\",\"inputs\":[{\"name\":\"withdrawalRoot\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"WithdrawalQueued\",\"inputs\":[{\"name\":\"withdrawalRoot\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"withdrawal\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIDelegationManager.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\":\"shares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AlreadyDelegated\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputArrayLengthMismatch\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputArrayLengthZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotCurrentlyDelegated\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OperatorDoesNotExist\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OperatorsCannotUndelegate\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SignatureExpired\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SignatureSaltSpent\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StakerOptOutWindowBlocksCannotDecrease\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StakerOptOutWindowBlocksExceedsMax\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UnauthorizedCaller\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"WithdrawalDelayExceedsMax\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"WithdrawalDelayNotElapsed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"WithdrawalDoesNotExist\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"WithdrawerNotStaker\",\"inputs\":[]}]", } // IDelegationManagerABI is the input ABI used to generate the binding from. diff --git a/pkg/bindings/IEigenPod/binding.go b/pkg/bindings/IEigenPod/binding.go index a07b03980..67461da0d 100644 --- a/pkg/bindings/IEigenPod/binding.go +++ b/pkg/bindings/IEigenPod/binding.go @@ -72,7 +72,7 @@ type IEigenPodValidatorInfo struct { // IEigenPodMetaData contains all meta data concerning the IEigenPod contract. var IEigenPodMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"function\",\"name\":\"activeValidatorCount\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"checkpointBalanceExitedGwei\",\"inputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"currentCheckpoint\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIEigenPod.Checkpoint\",\"components\":[{\"name\":\"beaconBlockRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proofsRemaining\",\"type\":\"uint24\",\"internalType\":\"uint24\"},{\"name\":\"podBalanceGwei\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"balanceDeltasGwei\",\"type\":\"int128\",\"internalType\":\"int128\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"currentCheckpointTimestamp\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"eigenPodManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigenPodManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getParentBlockRoot\",\"inputs\":[{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"lastCheckpointTimestamp\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"podOwner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proofSubmitter\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"recoverTokens\",\"inputs\":[{\"name\":\"tokenList\",\"type\":\"address[]\",\"internalType\":\"contractIERC20[]\"},{\"name\":\"amountsToWithdraw\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setProofSubmitter\",\"inputs\":[{\"name\":\"newProofSubmitter\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"stake\",\"inputs\":[{\"name\":\"pubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"depositDataRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"startCheckpoint\",\"inputs\":[{\"name\":\"revertIfNoBalance\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"validatorPubkeyHashToInfo\",\"inputs\":[{\"name\":\"validatorPubkeyHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIEigenPod.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\":\"enumIEigenPod.VALIDATOR_STATUS\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validatorPubkeyToInfo\",\"inputs\":[{\"name\":\"validatorPubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIEigenPod.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\":\"enumIEigenPod.VALIDATOR_STATUS\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validatorStatus\",\"inputs\":[{\"name\":\"validatorPubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPod.VALIDATOR_STATUS\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validatorStatus\",\"inputs\":[{\"name\":\"pubkeyHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPod.VALIDATOR_STATUS\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"verifyCheckpointProofs\",\"inputs\":[{\"name\":\"balanceContainerProof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.BalanceContainerProof\",\"components\":[{\"name\":\"balanceContainerRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"proofs\",\"type\":\"tuple[]\",\"internalType\":\"structBeaconChainProofs.BalanceProof[]\",\"components\":[{\"name\":\"pubkeyHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"balanceRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"verifyStaleBalance\",\"inputs\":[{\"name\":\"beaconTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"stateRootProof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.StateRootProof\",\"components\":[{\"name\":\"beaconStateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"proof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.ValidatorProof\",\"components\":[{\"name\":\"validatorFields\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"verifyWithdrawalCredentials\",\"inputs\":[{\"name\":\"beaconTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"stateRootProof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.StateRootProof\",\"components\":[{\"name\":\"beaconStateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"validatorIndices\",\"type\":\"uint40[]\",\"internalType\":\"uint40[]\"},{\"name\":\"validatorFieldsProofs\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"validatorFields\",\"type\":\"bytes32[][]\",\"internalType\":\"bytes32[][]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawRestakedBeaconChainETH\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawableRestakedExecutionLayerGwei\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"CheckpointCreated\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"beaconBlockRoot\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validatorCount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"CheckpointFinalized\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"totalShareDeltaWei\",\"type\":\"int256\",\"indexed\":false,\"internalType\":\"int256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"EigenPodStaked\",\"inputs\":[{\"name\":\"pubkey\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"NonBeaconChainETHReceived\",\"inputs\":[{\"name\":\"amountReceived\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ProofSubmitterUpdated\",\"inputs\":[{\"name\":\"prevProofSubmitter\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newProofSubmitter\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RestakedBeaconChainETHWithdrawn\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorBalanceUpdated\",\"inputs\":[{\"name\":\"validatorIndex\",\"type\":\"uint40\",\"indexed\":false,\"internalType\":\"uint40\"},{\"name\":\"balanceTimestamp\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"newValidatorBalanceGwei\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorCheckpointed\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorIndex\",\"type\":\"uint40\",\"indexed\":true,\"internalType\":\"uint40\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorRestaked\",\"inputs\":[{\"name\":\"validatorIndex\",\"type\":\"uint40\",\"indexed\":false,\"internalType\":\"uint40\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorWithdrawn\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorIndex\",\"type\":\"uint40\",\"indexed\":true,\"internalType\":\"uint40\"}],\"anonymous\":false}]", + 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\":\"structIEigenPod.Checkpoint\",\"components\":[{\"name\":\"beaconBlockRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proofsRemaining\",\"type\":\"uint24\",\"internalType\":\"uint24\"},{\"name\":\"podBalanceGwei\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"balanceDeltasGwei\",\"type\":\"int128\",\"internalType\":\"int128\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"currentCheckpointTimestamp\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"eigenPodManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigenPodManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getParentBlockRoot\",\"inputs\":[{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"lastCheckpointTimestamp\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"podOwner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proofSubmitter\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"recoverTokens\",\"inputs\":[{\"name\":\"tokenList\",\"type\":\"address[]\",\"internalType\":\"contractIERC20[]\"},{\"name\":\"amountsToWithdraw\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setProofSubmitter\",\"inputs\":[{\"name\":\"newProofSubmitter\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"stake\",\"inputs\":[{\"name\":\"pubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"depositDataRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"startCheckpoint\",\"inputs\":[{\"name\":\"revertIfNoBalance\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"validatorPubkeyHashToInfo\",\"inputs\":[{\"name\":\"validatorPubkeyHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIEigenPod.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\":\"enumIEigenPod.VALIDATOR_STATUS\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validatorPubkeyToInfo\",\"inputs\":[{\"name\":\"validatorPubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIEigenPod.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\":\"enumIEigenPod.VALIDATOR_STATUS\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validatorStatus\",\"inputs\":[{\"name\":\"validatorPubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPod.VALIDATOR_STATUS\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validatorStatus\",\"inputs\":[{\"name\":\"pubkeyHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPod.VALIDATOR_STATUS\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"verifyCheckpointProofs\",\"inputs\":[{\"name\":\"balanceContainerProof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.BalanceContainerProof\",\"components\":[{\"name\":\"balanceContainerRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"proofs\",\"type\":\"tuple[]\",\"internalType\":\"structBeaconChainProofs.BalanceProof[]\",\"components\":[{\"name\":\"pubkeyHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"balanceRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"verifyStaleBalance\",\"inputs\":[{\"name\":\"beaconTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"stateRootProof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.StateRootProof\",\"components\":[{\"name\":\"beaconStateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"proof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.ValidatorProof\",\"components\":[{\"name\":\"validatorFields\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"verifyWithdrawalCredentials\",\"inputs\":[{\"name\":\"beaconTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"stateRootProof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.StateRootProof\",\"components\":[{\"name\":\"beaconStateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"validatorIndices\",\"type\":\"uint40[]\",\"internalType\":\"uint40[]\"},{\"name\":\"validatorFieldsProofs\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"validatorFields\",\"type\":\"bytes32[][]\",\"internalType\":\"bytes32[][]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawRestakedBeaconChainETH\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawableRestakedExecutionLayerGwei\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"CheckpointCreated\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"beaconBlockRoot\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validatorCount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"CheckpointFinalized\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"totalShareDeltaWei\",\"type\":\"int256\",\"indexed\":false,\"internalType\":\"int256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"EigenPodStaked\",\"inputs\":[{\"name\":\"pubkey\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"NonBeaconChainETHReceived\",\"inputs\":[{\"name\":\"amountReceived\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ProofSubmitterUpdated\",\"inputs\":[{\"name\":\"prevProofSubmitter\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newProofSubmitter\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RestakedBeaconChainETHWithdrawn\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorBalanceUpdated\",\"inputs\":[{\"name\":\"validatorIndex\",\"type\":\"uint40\",\"indexed\":false,\"internalType\":\"uint40\"},{\"name\":\"balanceTimestamp\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"newValidatorBalanceGwei\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorCheckpointed\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorIndex\",\"type\":\"uint40\",\"indexed\":true,\"internalType\":\"uint40\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorRestaked\",\"inputs\":[{\"name\":\"validatorIndex\",\"type\":\"uint40\",\"indexed\":false,\"internalType\":\"uint40\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorWithdrawn\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorIndex\",\"type\":\"uint40\",\"indexed\":true,\"internalType\":\"uint40\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AmountMustBeMultipleOfGwei\",\"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\":\"InputAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputArrayLengthMismatch\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InsufficientWithdrawableBalance\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidEIP4788Response\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidPubKeyLength\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MsgValueNot32ETH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NoActiveCheckpoint\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NoBalanceToCheckpoint\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"TimestampOutOfRange\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UnauthorizedCaller\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ValidatorInactiveOnBeaconChain\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ValidatorIsExitingBeaconChain\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ValidatorNotActiveInPod\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ValidatorNotSlashedOnBeaconChain\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"WithdrawCredentialsNotForEigenPod\",\"inputs\":[]}]", } // IEigenPodABI is the input ABI used to generate the binding from. diff --git a/pkg/bindings/IEigenPodManager/binding.go b/pkg/bindings/IEigenPodManager/binding.go index 8574aafa1..b4094e029 100644 --- a/pkg/bindings/IEigenPodManager/binding.go +++ b/pkg/bindings/IEigenPodManager/binding.go @@ -31,7 +31,7 @@ var ( // IEigenPodManagerMetaData contains all meta data concerning the IEigenPodManager contract. var IEigenPodManagerMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"function\",\"name\":\"addShares\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"beaconChainETHStrategy\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"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\":\"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\":\"podOwnerShares\",\"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\":\"sharesDelta\",\"type\":\"int256\",\"internalType\":\"int256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeShares\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setPauserRegistry\",\"inputs\":[{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"slasher\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractISlasher\"}],\"stateMutability\":\"view\"},{\"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\":\"strategyManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawSharesAsTokens\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destination\",\"type\":\"address\",\"internalType\":\"address\"},{\"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\":\"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\":\"PauserRegistrySet\",\"inputs\":[{\"name\":\"pauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PodDeployed\",\"inputs\":[{\"name\":\"eigenPod\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PodSharesUpdated\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"sharesDelta\",\"type\":\"int256\",\"indexed\":false,\"internalType\":\"int256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false}]", + ABI: "[{\"type\":\"function\",\"name\":\"addShares\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"beaconChainETHStrategy\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"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\":\"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\":\"podOwnerShares\",\"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\":\"sharesDelta\",\"type\":\"int256\",\"internalType\":\"int256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeShares\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setPauserRegistry\",\"inputs\":[{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"slasher\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractISlasher\"}],\"stateMutability\":\"view\"},{\"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\":\"strategyManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawSharesAsTokens\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destination\",\"type\":\"address\",\"internalType\":\"address\"},{\"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\":\"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\":\"PauserRegistrySet\",\"inputs\":[{\"name\":\"pauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PodDeployed\",\"inputs\":[{\"name\":\"eigenPod\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PodSharesUpdated\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"sharesDelta\",\"type\":\"int256\",\"indexed\":false,\"internalType\":\"int256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"CurrentlyPaused\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"EigenPodAlreadyExists\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNewPausedStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyPauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnpauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SharesNegative\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SharesNotMultipleOfGwei\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UnauthorizedCaller\",\"inputs\":[]}]", } // IEigenPodManagerABI is the input ABI used to generate the binding from. diff --git a/pkg/bindings/IPausable/binding.go b/pkg/bindings/IPausable/binding.go index 4cef4b112..0cf64ce35 100644 --- a/pkg/bindings/IPausable/binding.go +++ b/pkg/bindings/IPausable/binding.go @@ -31,7 +31,7 @@ var ( // 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\":\"setPauserRegistry\",\"inputs\":[{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"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\":\"PauserRegistrySet\",\"inputs\":[{\"name\":\"pauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"}],\"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}]", + 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\":\"setPauserRegistry\",\"inputs\":[{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"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\":\"PauserRegistrySet\",\"inputs\":[{\"name\":\"pauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"}],\"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. diff --git a/pkg/bindings/IPauserRegistry/binding.go b/pkg/bindings/IPauserRegistry/binding.go index 59678ea9e..aaa464fef 100644 --- a/pkg/bindings/IPauserRegistry/binding.go +++ b/pkg/bindings/IPauserRegistry/binding.go @@ -31,7 +31,7 @@ var ( // 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}]", + 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. diff --git a/pkg/bindings/IRewardsCoordinator/binding.go b/pkg/bindings/IRewardsCoordinator/binding.go index caacc527a..5314b039e 100644 --- a/pkg/bindings/IRewardsCoordinator/binding.go +++ b/pkg/bindings/IRewardsCoordinator/binding.go @@ -77,7 +77,7 @@ type IRewardsCoordinatorTokenTreeMerkleLeaf struct { // IRewardsCoordinatorMetaData contains all meta data concerning the IRewardsCoordinator contract. var IRewardsCoordinatorMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"function\",\"name\":\"CALCULATION_INTERVAL_SECONDS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"GENESIS_REWARDS_TIMESTAMP\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_FUTURE_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_RETROACTIVE_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_REWARDS_DURATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activationDelay\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateEarnerLeafHash\",\"inputs\":[{\"name\":\"leaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.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\":\"structIRewardsCoordinator.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\":\"structIRewardsCoordinator.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\":\"structIRewardsCoordinator.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\":\"structIRewardsCoordinator.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\":\"structIRewardsCoordinator.RewardsSubmission[]\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.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\":\"createRewardsForAllEarners\",\"inputs\":[{\"name\":\"rewardsSubmissions\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.RewardsSubmission[]\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.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\":\"rewardsSubmission\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.RewardsSubmission[]\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.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\":\"disableRoot\",\"inputs\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getCurrentClaimableDistributionRoot\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.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\":\"structIRewardsCoordinator.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\":\"structIRewardsCoordinator.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\":\"getRootIndexFromHash\",\"inputs\":[{\"name\":\"rootHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"globalOperatorCommissionBips\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"operatorCommissionBips\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"processClaim\",\"inputs\":[{\"name\":\"claim\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.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\":\"structIRewardsCoordinator.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\":\"structIRewardsCoordinator.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\":\"setGlobalOperatorCommission\",\"inputs\":[{\"name\":\"_globalCommissionBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setRewardsForAllSubmitter\",\"inputs\":[{\"name\":\"_submitter\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_newValue\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setRewardsUpdater\",\"inputs\":[{\"name\":\"_rewardsUpdater\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"submitRoot\",\"inputs\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AVSRewardsSubmissionCreated\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"submissionNonce\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"rewardsSubmissionHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewardsSubmission\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIRewardsCoordinator.RewardsSubmission\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.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\":\"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\":\"GlobalCommissionBipsSet\",\"inputs\":[{\"name\":\"oldGlobalCommissionBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"},{\"name\":\"newGlobalCommissionBips\",\"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\":\"structIRewardsCoordinator.RewardsSubmission\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.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\":\"structIRewardsCoordinator.RewardsSubmission\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.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}]", + 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\":\"structIRewardsCoordinator.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\":\"structIRewardsCoordinator.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\":\"structIRewardsCoordinator.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\":\"structIRewardsCoordinator.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\":\"structIRewardsCoordinator.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\":\"structIRewardsCoordinator.RewardsSubmission[]\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.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\":\"createRewardsForAllEarners\",\"inputs\":[{\"name\":\"rewardsSubmissions\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.RewardsSubmission[]\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.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\":\"rewardsSubmission\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.RewardsSubmission[]\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.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\":\"disableRoot\",\"inputs\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getCurrentClaimableDistributionRoot\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.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\":\"structIRewardsCoordinator.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\":\"structIRewardsCoordinator.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\":\"getRootIndexFromHash\",\"inputs\":[{\"name\":\"rootHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"globalOperatorCommissionBips\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"operatorCommissionBips\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"processClaim\",\"inputs\":[{\"name\":\"claim\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.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\":\"structIRewardsCoordinator.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\":\"structIRewardsCoordinator.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\":\"setGlobalOperatorCommission\",\"inputs\":[{\"name\":\"_globalCommissionBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setRewardsForAllSubmitter\",\"inputs\":[{\"name\":\"_submitter\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_newValue\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setRewardsUpdater\",\"inputs\":[{\"name\":\"_rewardsUpdater\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"submitRoot\",\"inputs\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AVSRewardsSubmissionCreated\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"submissionNonce\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"rewardsSubmissionHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewardsSubmission\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIRewardsCoordinator.RewardsSubmission\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.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\":\"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\":\"GlobalCommissionBipsSet\",\"inputs\":[{\"name\":\"oldGlobalCommissionBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"},{\"name\":\"newGlobalCommissionBips\",\"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\":\"structIRewardsCoordinator.RewardsSubmission\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.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\":\"structIRewardsCoordinator.RewardsSubmission\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsUpdaterSet\",\"inputs\":[{\"name\":\"oldRewardsUpdater\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newRewardsUpdater\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AmountExceedsMax\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"AmountIsZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"DurationExceedsMax\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"EarningsNotGreaterThanClaimed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputArrayLengthMismatch\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputArrayLengthZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidClaimProof\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDurationRemainder\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidEarnerLeafIndex\",\"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\":\"RewardsEndTimestampNotElapsed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RootAlreadyActivated\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RootDisabled\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RootNotActivated\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StartTimestampTooFarInFuture\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StartTimestampTooFarInPast\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategiesNotInAscendingOrder\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyNotWhitelisted\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UnauthorizedCaller\",\"inputs\":[]}]", } // IRewardsCoordinatorABI is the input ABI used to generate the binding from. diff --git a/pkg/bindings/IStrategy/binding.go b/pkg/bindings/IStrategy/binding.go index 4d3e0fcae..c08a0da6e 100644 --- a/pkg/bindings/IStrategy/binding.go +++ b/pkg/bindings/IStrategy/binding.go @@ -31,7 +31,7 @@ var ( // IStrategyMetaData contains all meta data concerning the IStrategy contract. var IStrategyMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"function\",\"name\":\"deposit\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"explanation\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"shares\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"sharesToUnderlying\",\"inputs\":[{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"sharesToUnderlyingView\",\"inputs\":[{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"totalShares\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToShares\",\"inputs\":[{\"name\":\"amountUnderlying\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"underlyingToSharesView\",\"inputs\":[{\"name\":\"amountUnderlying\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToken\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"userUnderlying\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"userUnderlyingView\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"withdraw\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"ExchangeRateEmitted\",\"inputs\":[{\"name\":\"rate\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyTokenSet\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIERC20\"},{\"name\":\"decimals\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false}]", + ABI: "[{\"type\":\"function\",\"name\":\"deposit\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"explanation\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"shares\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"sharesToUnderlying\",\"inputs\":[{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"sharesToUnderlyingView\",\"inputs\":[{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"totalShares\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToShares\",\"inputs\":[{\"name\":\"amountUnderlying\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"underlyingToSharesView\",\"inputs\":[{\"name\":\"amountUnderlying\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToken\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"userUnderlying\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"userUnderlyingView\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"withdraw\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"ExchangeRateEmitted\",\"inputs\":[{\"name\":\"rate\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyTokenSet\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIERC20\"},{\"name\":\"decimals\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"BalanceExceedsMaxTotalDeposits\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxPerDepositExceedsMax\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NewSharesZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnderlyingToken\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"TotalSharesExceedsMax\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UnauthorizedCaller\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"WithdrawalAmountExceedsTotalDeposits\",\"inputs\":[]}]", } // IStrategyABI is the input ABI used to generate the binding from. diff --git a/pkg/bindings/IStrategyFactory/binding.go b/pkg/bindings/IStrategyFactory/binding.go index 70f95fe3e..29cda340c 100644 --- a/pkg/bindings/IStrategyFactory/binding.go +++ b/pkg/bindings/IStrategyFactory/binding.go @@ -31,7 +31,7 @@ var ( // IStrategyFactoryMetaData contains all meta data concerning the IStrategyFactory contract. var IStrategyFactoryMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"function\",\"name\":\"deployNewStrategy\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[{\"name\":\"newStrategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"deployedStrategies\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"removeStrategiesFromWhitelist\",\"inputs\":[{\"name\":\"strategiesToRemoveFromWhitelist\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setThirdPartyTransfersForbidden\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"value\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"strategyBeacon\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIBeacon\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"whitelistStrategies\",\"inputs\":[{\"name\":\"strategiesToWhitelist\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"thirdPartyTransfersForbiddenValues\",\"type\":\"bool[]\",\"internalType\":\"bool[]\"}],\"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}]", + 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\":\"setThirdPartyTransfersForbidden\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"value\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"strategyBeacon\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIBeacon\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"whitelistStrategies\",\"inputs\":[{\"name\":\"strategiesToWhitelist\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"thirdPartyTransfersForbiddenValues\",\"type\":\"bool[]\",\"internalType\":\"bool[]\"}],\"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. diff --git a/pkg/bindings/IStrategyManager/binding.go b/pkg/bindings/IStrategyManager/binding.go index 5dc38621c..0a989a611 100644 --- a/pkg/bindings/IStrategyManager/binding.go +++ b/pkg/bindings/IStrategyManager/binding.go @@ -31,7 +31,7 @@ var ( // IStrategyManagerMetaData contains all meta data concerning the IStrategyManager contract. var IStrategyManagerMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"function\",\"name\":\"addShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addStrategiesToDepositWhitelist\",\"inputs\":[{\"name\":\"strategiesToWhitelist\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"thirdPartyTransfersForbiddenValues\",\"type\":\"bool[]\",\"internalType\":\"bool[]\"}],\"outputs\":[],\"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\":\"shares\",\"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\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"eigenPodManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigenPodManager\"}],\"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\":\"removeShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeStrategiesFromDepositWhitelist\",\"inputs\":[{\"name\":\"strategiesToRemoveFromWhitelist\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setThirdPartyTransfersForbidden\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"value\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"slasher\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractISlasher\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"stakerStrategyListLength\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"stakerStrategyShares\",\"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\":\"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\":\"thirdPartyTransfersForbidden\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"withdrawSharesAsTokens\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"Deposit\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIERC20\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyAddedToDepositWhitelist\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyRemovedFromDepositWhitelist\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyWhitelisterChanged\",\"inputs\":[{\"name\":\"previousAddress\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newAddress\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"UpdatedThirdPartyTransfersForbidden\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"value\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false}]", + ABI: "[{\"type\":\"function\",\"name\":\"addShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addStrategiesToDepositWhitelist\",\"inputs\":[{\"name\":\"strategiesToWhitelist\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"thirdPartyTransfersForbiddenValues\",\"type\":\"bool[]\",\"internalType\":\"bool[]\"}],\"outputs\":[],\"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\":\"shares\",\"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\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"eigenPodManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigenPodManager\"}],\"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\":\"removeShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeStrategiesFromDepositWhitelist\",\"inputs\":[{\"name\":\"strategiesToRemoveFromWhitelist\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setThirdPartyTransfersForbidden\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"value\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"slasher\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractISlasher\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"stakerStrategyListLength\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"stakerStrategyShares\",\"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\":\"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\":\"thirdPartyTransfersForbidden\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"withdrawSharesAsTokens\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"Deposit\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIERC20\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyAddedToDepositWhitelist\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyRemovedFromDepositWhitelist\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyWhitelisterChanged\",\"inputs\":[{\"name\":\"previousAddress\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newAddress\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"UpdatedThirdPartyTransfersForbidden\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"value\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"InputArrayLengthMismatch\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InsufficientShares\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxStrategiesExceeded\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SharesAmountZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SignatureExpired\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StakerAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyNotFound\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyNotWhitelisted\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ThirdPartyTransfersDisabled\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UnauthorizedCaller\",\"inputs\":[]}]", } // IStrategyManagerABI is the input ABI used to generate the binding from. diff --git a/pkg/bindings/MagnitudeCheckpoints/binding.go b/pkg/bindings/MagnitudeCheckpoints/binding.go new file mode 100644 index 000000000..9a5a2ef52 --- /dev/null +++ b/pkg/bindings/MagnitudeCheckpoints/binding.go @@ -0,0 +1,203 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package MagnitudeCheckpoints + +import ( + "errors" + "math/big" + "strings" + + ethereum "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/event" +) + +// Reference imports to suppress errors if they are not otherwise used. +var ( + _ = errors.New + _ = big.NewInt + _ = strings.NewReader + _ = ethereum.NotFound + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription + _ = abi.ConvertType +) + +// MagnitudeCheckpointsMetaData contains all meta data concerning the MagnitudeCheckpoints contract. +var MagnitudeCheckpointsMetaData = &bind.MetaData{ + ABI: "[]", + Bin: "0x60566037600b82828239805160001a607314602a57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea2646970667358221220d403c7152d652d1a100c83daf55d72392c025180800bf29f79d386c0af19a05d64736f6c634300080c0033", +} + +// MagnitudeCheckpointsABI is the input ABI used to generate the binding from. +// Deprecated: Use MagnitudeCheckpointsMetaData.ABI instead. +var MagnitudeCheckpointsABI = MagnitudeCheckpointsMetaData.ABI + +// MagnitudeCheckpointsBin is the compiled bytecode used for deploying new contracts. +// Deprecated: Use MagnitudeCheckpointsMetaData.Bin instead. +var MagnitudeCheckpointsBin = MagnitudeCheckpointsMetaData.Bin + +// DeployMagnitudeCheckpoints deploys a new Ethereum contract, binding an instance of MagnitudeCheckpoints to it. +func DeployMagnitudeCheckpoints(auth *bind.TransactOpts, backend bind.ContractBackend) (common.Address, *types.Transaction, *MagnitudeCheckpoints, error) { + parsed, err := MagnitudeCheckpointsMetaData.GetAbi() + if err != nil { + return common.Address{}, nil, nil, err + } + if parsed == nil { + return common.Address{}, nil, nil, errors.New("GetABI returned nil") + } + + address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(MagnitudeCheckpointsBin), backend) + if err != nil { + return common.Address{}, nil, nil, err + } + return address, tx, &MagnitudeCheckpoints{MagnitudeCheckpointsCaller: MagnitudeCheckpointsCaller{contract: contract}, MagnitudeCheckpointsTransactor: MagnitudeCheckpointsTransactor{contract: contract}, MagnitudeCheckpointsFilterer: MagnitudeCheckpointsFilterer{contract: contract}}, nil +} + +// MagnitudeCheckpoints is an auto generated Go binding around an Ethereum contract. +type MagnitudeCheckpoints struct { + MagnitudeCheckpointsCaller // Read-only binding to the contract + MagnitudeCheckpointsTransactor // Write-only binding to the contract + MagnitudeCheckpointsFilterer // Log filterer for contract events +} + +// MagnitudeCheckpointsCaller is an auto generated read-only Go binding around an Ethereum contract. +type MagnitudeCheckpointsCaller struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// MagnitudeCheckpointsTransactor is an auto generated write-only Go binding around an Ethereum contract. +type MagnitudeCheckpointsTransactor struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// MagnitudeCheckpointsFilterer is an auto generated log filtering Go binding around an Ethereum contract events. +type MagnitudeCheckpointsFilterer struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// MagnitudeCheckpointsSession is an auto generated Go binding around an Ethereum contract, +// with pre-set call and transact options. +type MagnitudeCheckpointsSession struct { + Contract *MagnitudeCheckpoints // Generic contract binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// MagnitudeCheckpointsCallerSession is an auto generated read-only Go binding around an Ethereum contract, +// with pre-set call options. +type MagnitudeCheckpointsCallerSession struct { + Contract *MagnitudeCheckpointsCaller // Generic contract caller binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session +} + +// MagnitudeCheckpointsTransactorSession is an auto generated write-only Go binding around an Ethereum contract, +// with pre-set transact options. +type MagnitudeCheckpointsTransactorSession struct { + Contract *MagnitudeCheckpointsTransactor // Generic contract transactor binding to set the session for + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// MagnitudeCheckpointsRaw is an auto generated low-level Go binding around an Ethereum contract. +type MagnitudeCheckpointsRaw struct { + Contract *MagnitudeCheckpoints // Generic contract binding to access the raw methods on +} + +// MagnitudeCheckpointsCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. +type MagnitudeCheckpointsCallerRaw struct { + Contract *MagnitudeCheckpointsCaller // Generic read-only contract binding to access the raw methods on +} + +// MagnitudeCheckpointsTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. +type MagnitudeCheckpointsTransactorRaw struct { + Contract *MagnitudeCheckpointsTransactor // Generic write-only contract binding to access the raw methods on +} + +// NewMagnitudeCheckpoints creates a new instance of MagnitudeCheckpoints, bound to a specific deployed contract. +func NewMagnitudeCheckpoints(address common.Address, backend bind.ContractBackend) (*MagnitudeCheckpoints, error) { + contract, err := bindMagnitudeCheckpoints(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &MagnitudeCheckpoints{MagnitudeCheckpointsCaller: MagnitudeCheckpointsCaller{contract: contract}, MagnitudeCheckpointsTransactor: MagnitudeCheckpointsTransactor{contract: contract}, MagnitudeCheckpointsFilterer: MagnitudeCheckpointsFilterer{contract: contract}}, nil +} + +// NewMagnitudeCheckpointsCaller creates a new read-only instance of MagnitudeCheckpoints, bound to a specific deployed contract. +func NewMagnitudeCheckpointsCaller(address common.Address, caller bind.ContractCaller) (*MagnitudeCheckpointsCaller, error) { + contract, err := bindMagnitudeCheckpoints(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &MagnitudeCheckpointsCaller{contract: contract}, nil +} + +// NewMagnitudeCheckpointsTransactor creates a new write-only instance of MagnitudeCheckpoints, bound to a specific deployed contract. +func NewMagnitudeCheckpointsTransactor(address common.Address, transactor bind.ContractTransactor) (*MagnitudeCheckpointsTransactor, error) { + contract, err := bindMagnitudeCheckpoints(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &MagnitudeCheckpointsTransactor{contract: contract}, nil +} + +// NewMagnitudeCheckpointsFilterer creates a new log filterer instance of MagnitudeCheckpoints, bound to a specific deployed contract. +func NewMagnitudeCheckpointsFilterer(address common.Address, filterer bind.ContractFilterer) (*MagnitudeCheckpointsFilterer, error) { + contract, err := bindMagnitudeCheckpoints(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &MagnitudeCheckpointsFilterer{contract: contract}, nil +} + +// bindMagnitudeCheckpoints binds a generic wrapper to an already deployed contract. +func bindMagnitudeCheckpoints(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := MagnitudeCheckpointsMetaData.GetAbi() + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_MagnitudeCheckpoints *MagnitudeCheckpointsRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _MagnitudeCheckpoints.Contract.MagnitudeCheckpointsCaller.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_MagnitudeCheckpoints *MagnitudeCheckpointsRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _MagnitudeCheckpoints.Contract.MagnitudeCheckpointsTransactor.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_MagnitudeCheckpoints *MagnitudeCheckpointsRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _MagnitudeCheckpoints.Contract.MagnitudeCheckpointsTransactor.contract.Transact(opts, method, params...) +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_MagnitudeCheckpoints *MagnitudeCheckpointsCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _MagnitudeCheckpoints.Contract.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_MagnitudeCheckpoints *MagnitudeCheckpointsTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _MagnitudeCheckpoints.Contract.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_MagnitudeCheckpoints *MagnitudeCheckpointsTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _MagnitudeCheckpoints.Contract.contract.Transact(opts, method, params...) +} diff --git a/pkg/bindings/Merkle/binding.go b/pkg/bindings/Merkle/binding.go index 93e82af72..30dbb707b 100644 --- a/pkg/bindings/Merkle/binding.go +++ b/pkg/bindings/Merkle/binding.go @@ -31,8 +31,8 @@ var ( // MerkleMetaData contains all meta data concerning the Merkle contract. var MerkleMetaData = &bind.MetaData{ - ABI: "[]", - Bin: "0x60566037600b82828239805160001a607314602a57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea2646970667358221220de4dce1b90fa553d4573afc57ce3ea0458378cac0669dc216b6be8ae471c99ea64736f6c634300080c0033", + ABI: "[{\"type\":\"error\",\"name\":\"InvalidProofLength\",\"inputs\":[]}]", + Bin: "0x60566037600b82828239805160001a607314602a57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea26469706673582212204da395636110a7cf46074c013ff3ff17f6581b7227bb418adfc924152a6396af64736f6c634300081b0033", } // MerkleABI is the input ABI used to generate the binding from. diff --git a/pkg/bindings/Pausable/binding.go b/pkg/bindings/Pausable/binding.go index 744b7e84b..6dbe44ec5 100644 --- a/pkg/bindings/Pausable/binding.go +++ b/pkg/bindings/Pausable/binding.go @@ -31,8 +31,8 @@ var ( // 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\":\"setPauserRegistry\",\"inputs\":[{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"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\":\"PauserRegistrySet\",\"inputs\":[{\"name\":\"pauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"}],\"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}]", - Bin: "0x608060405234801561001057600080fd5b506107c2806100206000396000f3fe608060405234801561001057600080fd5b506004361061007d5760003560e01c80635ac86ab71161005b5780635ac86ab7146100b25780635c975abb146100e6578063886f1195146100f7578063fabc1cbc1461012257600080fd5b806310d67a2f14610082578063136439dd14610097578063595c6a67146100aa575b600080fd5b61009561009036600461065b565b610135565b005b6100956100a536600461067f565b6101ef565b61009561032e565b6100d16100c0366004610698565b6001805460ff9092161b9081161490565b60405190151581526020015b60405180910390f35b6001546040519081526020016100dd565b60005461010a906001600160a01b031681565b6040516001600160a01b0390911681526020016100dd565b61009561013036600461067f565b6103f5565b60008054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610186573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101aa91906106bb565b6001600160a01b0316336001600160a01b0316146101e35760405162461bcd60e51b81526004016101da906106d8565b60405180910390fd5b6101ec8161054f565b50565b60005460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015610237573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061025b9190610722565b6102775760405162461bcd60e51b81526004016101da90610744565b600154818116146102f05760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c697479000000000000000060648201526084016101da565b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b60005460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015610376573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061039a9190610722565b6103b65760405162461bcd60e51b81526004016101da90610744565b600019600181905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b60008054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610446573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061046a91906106bb565b6001600160a01b0316336001600160a01b03161461049a5760405162461bcd60e51b81526004016101da906106d8565b6001541981196001541916146105185760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c697479000000000000000060648201526084016101da565b600181905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c90602001610323565b6001600160a01b0381166105dd5760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a4016101da565b600054604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1600080546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03811681146101ec57600080fd5b60006020828403121561066d57600080fd5b813561067881610646565b9392505050565b60006020828403121561069157600080fd5b5035919050565b6000602082840312156106aa57600080fd5b813560ff8116811461067857600080fd5b6000602082840312156106cd57600080fd5b815161067881610646565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b60006020828403121561073457600080fd5b8151801515811461067857600080fd5b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b60608201526080019056fea26469706673582212202c2653223ee00d36dc739f8691b398adc60ad925c3636f4c4c9e100e9732974164736f6c634300080c0033", + 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\":\"setPauserRegistry\",\"inputs\":[{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"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\":\"PauserRegistrySet\",\"inputs\":[{\"name\":\"pauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"}],\"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\":[]}]", + Bin: "0x6080604052348015600f57600080fd5b5061061a8061001f6000396000f3fe608060405234801561001057600080fd5b506004361061007d5760003560e01c80635ac86ab71161005b5780635ac86ab7146100b25780635c975abb146100e6578063886f1195146100f7578063fabc1cbc1461012257600080fd5b806310d67a2f14610082578063136439dd14610097578063595c6a67146100aa575b600080fd5b610095610090366004610545565b610135565b005b6100956100a5366004610569565b6101e7565b6100956102d2565b6100d16100c0366004610582565b6001805460ff9092161b9081161490565b60405190151581526020015b60405180910390f35b6001546040519081526020016100dd565b60005461010a906001600160a01b031681565b6040516001600160a01b0390911681526020016100dd565b610095610130366004610569565b61039a565b60008054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610186573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101aa91906105a5565b6001600160a01b0316336001600160a01b0316146101db5760405163794821ff60e01b815260040160405180910390fd5b6101e4816104a0565b50565b60005460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa15801561022f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061025391906105c2565b61027057604051631d77d47760e21b815260040160405180910390fd5b600154818116146102945760405163c61dca5d60e01b815260040160405180910390fd5b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b60005460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa15801561031a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061033e91906105c2565b61035b57604051631d77d47760e21b815260040160405180910390fd5b600019600181905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b60008054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156103eb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061040f91906105a5565b6001600160a01b0316336001600160a01b0316146104405760405163794821ff60e01b815260040160405180910390fd5b6001541981196001541916146104695760405163c61dca5d60e01b815260040160405180910390fd5b600181905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c906020016102c7565b6001600160a01b0381166104c7576040516339b190bb60e11b815260040160405180910390fd5b600054604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1600080546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03811681146101e457600080fd5b60006020828403121561055757600080fd5b813561056281610530565b9392505050565b60006020828403121561057b57600080fd5b5035919050565b60006020828403121561059457600080fd5b813560ff8116811461056257600080fd5b6000602082840312156105b757600080fd5b815161056281610530565b6000602082840312156105d457600080fd5b8151801515811461056257600080fdfea2646970667358221220ca494d4d98e0f8f6a6ff05c79faaec402f1775db5b5b2c32aa4192192461486f64736f6c634300081b0033", } // PausableABI is the input ABI used to generate the binding from. diff --git a/pkg/bindings/PauserRegistry/binding.go b/pkg/bindings/PauserRegistry/binding.go index bcfe873b2..bd04c34af 100644 --- a/pkg/bindings/PauserRegistry/binding.go +++ b/pkg/bindings/PauserRegistry/binding.go @@ -31,8 +31,8 @@ var ( // PauserRegistryMetaData contains all meta data concerning the PauserRegistry contract. var PauserRegistryMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_pausers\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"_unpauser\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isPauser\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setIsPauser\",\"inputs\":[{\"name\":\"newPauser\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"canPause\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setUnpauser\",\"inputs\":[{\"name\":\"newUnpauser\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpauser\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"PauserStatusChanged\",\"inputs\":[{\"name\":\"pauser\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"canPause\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"UnpauserChanged\",\"inputs\":[{\"name\":\"previousUnpauser\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newUnpauser\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false}]", - Bin: "0x608060405234801561001057600080fd5b5060405161077838038061077883398101604081905261002f91610263565b60005b82518110156100775761006583828151811061005057610050610339565b6020026020010151600161008860201b60201c565b8061006f8161034f565b915050610032565b506100818161015a565b5050610378565b6001600160a01b0382166100f95760405162461bcd60e51b815260206004820152602d60248201527f50617573657252656769737472792e5f7365745061757365723a207a65726f2060448201526c1859191c995cdcc81a5b9c1d5d609a1b60648201526084015b60405180910390fd5b6001600160a01b03821660008181526020818152604091829020805460ff19168515159081179091558251938452908301527f65d3a1fd4c13f05cba164f80d03ce90fb4b5e21946bfc3ab7dbd434c2d0b9152910160405180910390a15050565b6001600160a01b0381166101c85760405162461bcd60e51b815260206004820152602f60248201527f50617573657252656769737472792e5f736574556e7061757365723a207a657260448201526e1bc81859191c995cdcc81a5b9c1d5d608a1b60648201526084016100f0565b600154604080516001600160a01b03928316815291831660208301527f06b4167a2528887a1e97a366eefe8549bfbf1ea3e6ac81cb2564a934d20e8892910160405180910390a1600180546001600160a01b0319166001600160a01b0392909216919091179055565b634e487b7160e01b600052604160045260246000fd5b80516001600160a01b038116811461025e57600080fd5b919050565b6000806040838503121561027657600080fd5b82516001600160401b038082111561028d57600080fd5b818501915085601f8301126102a157600080fd5b81516020828211156102b5576102b5610231565b8160051b604051601f19603f830116810181811086821117156102da576102da610231565b6040529283528183019350848101820192898411156102f857600080fd5b948201945b8386101561031d5761030e86610247565b855294820194938201936102fd565b965061032c9050878201610247565b9450505050509250929050565b634e487b7160e01b600052603260045260246000fd5b600060001982141561037157634e487b7160e01b600052601160045260246000fd5b5060010190565b6103f1806103876000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c806346fbf68e146100515780638568520614610089578063ce5484281461009e578063eab66d7a146100b1575b600080fd5b61007461005f366004610313565b60006020819052908152604090205460ff1681565b60405190151581526020015b60405180910390f35b61009c610097366004610335565b6100dc565b005b61009c6100ac366004610313565b61011d565b6001546100c4906001600160a01b031681565b6040516001600160a01b039091168152602001610080565b6001546001600160a01b0316331461010f5760405162461bcd60e51b815260040161010690610371565b60405180910390fd5b6101198282610153565b5050565b6001546001600160a01b031633146101475760405162461bcd60e51b815260040161010690610371565b61015081610220565b50565b6001600160a01b0382166101bf5760405162461bcd60e51b815260206004820152602d60248201527f50617573657252656769737472792e5f7365745061757365723a207a65726f2060448201526c1859191c995cdcc81a5b9c1d5d609a1b6064820152608401610106565b6001600160a01b03821660008181526020818152604091829020805460ff19168515159081179091558251938452908301527f65d3a1fd4c13f05cba164f80d03ce90fb4b5e21946bfc3ab7dbd434c2d0b9152910160405180910390a15050565b6001600160a01b03811661028e5760405162461bcd60e51b815260206004820152602f60248201527f50617573657252656769737472792e5f736574556e7061757365723a207a657260448201526e1bc81859191c995cdcc81a5b9c1d5d608a1b6064820152608401610106565b600154604080516001600160a01b03928316815291831660208301527f06b4167a2528887a1e97a366eefe8549bfbf1ea3e6ac81cb2564a934d20e8892910160405180910390a1600180546001600160a01b0319166001600160a01b0392909216919091179055565b80356001600160a01b038116811461030e57600080fd5b919050565b60006020828403121561032557600080fd5b61032e826102f7565b9392505050565b6000806040838503121561034857600080fd5b610351836102f7565b91506020830135801515811461036657600080fd5b809150509250929050565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b60608201526080019056fea26469706673582212203b45f7c66225e5887e8907d44b53ad76d03563101c6febf801e78006f96642e664736f6c634300080c0033", + 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: "0x608060405234801561001057600080fd5b506040516105e23803806105e283398101604081905261002f916101c8565b60005b825181101561006d57610065838281518110610050576100506102a9565b6020026020010151600161007e60201b60201c565b600101610032565b5061007781610106565b50506102bf565b6001600160a01b0382166100a5576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b03821660008181526020818152604091829020805460ff19168515159081179091558251938452908301527f65d3a1fd4c13f05cba164f80d03ce90fb4b5e21946bfc3ab7dbd434c2d0b9152910160405180910390a15050565b6001600160a01b03811661012d576040516339b190bb60e11b815260040160405180910390fd5b600154604080516001600160a01b03928316815291831660208301527f06b4167a2528887a1e97a366eefe8549bfbf1ea3e6ac81cb2564a934d20e8892910160405180910390a1600180546001600160a01b0319166001600160a01b0392909216919091179055565b634e487b7160e01b600052604160045260246000fd5b80516001600160a01b03811681146101c357600080fd5b919050565b600080604083850312156101db57600080fd5b82516001600160401b038111156101f157600080fd5b8301601f8101851361020257600080fd5b80516001600160401b0381111561021b5761021b610196565b604051600582901b90603f8201601f191681016001600160401b038111828210171561024957610249610196565b60405291825260208184018101929081018884111561026757600080fd5b6020850194505b8385101561028d5761027f856101ac565b81526020948501940161026e565b5094506102a092505050602084016101ac565b90509250929050565b634e487b7160e01b600052603260045260246000fd5b610314806102ce6000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c806346fbf68e146100515780638568520614610089578063ce5484281461009e578063eab66d7a146100b1575b600080fd5b61007461005f366004610280565b60006020819052908152604090205460ff1681565b60405190151581526020015b60405180910390f35b61009c6100973660046102a2565b6100dc565b005b61009c6100ac366004610280565b610115565b6001546100c4906001600160a01b031681565b6040516001600160a01b039091168152602001610080565b6001546001600160a01b031633146101075760405163794821ff60e01b815260040160405180910390fd5b610111828261014c565b5050565b6001546001600160a01b031633146101405760405163794821ff60e01b815260040160405180910390fd5b610149816101d4565b50565b6001600160a01b038216610173576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b03821660008181526020818152604091829020805460ff19168515159081179091558251938452908301527f65d3a1fd4c13f05cba164f80d03ce90fb4b5e21946bfc3ab7dbd434c2d0b9152910160405180910390a15050565b6001600160a01b0381166101fb576040516339b190bb60e11b815260040160405180910390fd5b600154604080516001600160a01b03928316815291831660208301527f06b4167a2528887a1e97a366eefe8549bfbf1ea3e6ac81cb2564a934d20e8892910160405180910390a1600180546001600160a01b0319166001600160a01b0392909216919091179055565b80356001600160a01b038116811461027b57600080fd5b919050565b60006020828403121561029257600080fd5b61029b82610264565b9392505050565b600080604083850312156102b557600080fd5b6102be83610264565b9150602083013580151581146102d357600080fd5b80915050925092905056fea2646970667358221220229f4c78b91a361b788964e47586a94431d9f4ebedaa647d947f6a0895378b1164736f6c634300081b0033", } // PauserRegistryABI is the input ABI used to generate the binding from. diff --git a/pkg/bindings/RewardsCoordinator/binding.go b/pkg/bindings/RewardsCoordinator/binding.go index 2e8d7e02f..a00e3817f 100644 --- a/pkg/bindings/RewardsCoordinator/binding.go +++ b/pkg/bindings/RewardsCoordinator/binding.go @@ -77,8 +77,8 @@ type IRewardsCoordinatorTokenTreeMerkleLeaf struct { // RewardsCoordinatorMetaData contains all meta data concerning the RewardsCoordinator contract. var RewardsCoordinatorMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_delegationManager\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"},{\"name\":\"_strategyManager\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"},{\"name\":\"_CALCULATION_INTERVAL_SECONDS\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_MAX_REWARDS_DURATION\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_MAX_RETROACTIVE_LENGTH\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_MAX_FUTURE_LENGTH\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"__GENESIS_REWARDS_TIMESTAMP\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"CALCULATION_INTERVAL_SECONDS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"GENESIS_REWARDS_TIMESTAMP\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_FUTURE_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_RETROACTIVE_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_REWARDS_DURATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activationDelay\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"beaconChainETHStrategy\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateEarnerLeafHash\",\"inputs\":[{\"name\":\"leaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.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\":\"structIRewardsCoordinator.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\":\"structIRewardsCoordinator.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\":\"structIRewardsCoordinator.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\":\"structIRewardsCoordinator.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\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"createAVSRewardsSubmission\",\"inputs\":[{\"name\":\"rewardsSubmissions\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.RewardsSubmission[]\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.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\":\"createRewardsForAllEarners\",\"inputs\":[{\"name\":\"rewardsSubmissions\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.RewardsSubmission[]\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.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\":\"structIRewardsCoordinator.RewardsSubmission[]\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.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\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"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\":\"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\":\"domainSeparator\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getCurrentClaimableDistributionRoot\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.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\":\"structIRewardsCoordinator.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\":\"structIRewardsCoordinator.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\":\"getRootIndexFromHash\",\"inputs\":[{\"name\":\"rootHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"globalOperatorCommissionBips\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"initialPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_rewardsUpdater\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_activationDelay\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_globalCommissionBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isAVSRewardsSubmissionHash\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isRewardsForAllSubmitter\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isRewardsSubmissionForAllEarnersHash\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isRewardsSubmissionForAllHash\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"operatorCommissionBips\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"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\":\"processClaim\",\"inputs\":[{\"name\":\"claim\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.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\":\"structIRewardsCoordinator.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\":\"structIRewardsCoordinator.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\":\"setGlobalOperatorCommission\",\"inputs\":[{\"name\":\"_globalCommissionBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setPauserRegistry\",\"inputs\":[{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"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\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"submitRoot\",\"inputs\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AVSRewardsSubmissionCreated\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"submissionNonce\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"rewardsSubmissionHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewardsSubmission\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIRewardsCoordinator.RewardsSubmission\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.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\":\"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\":\"GlobalCommissionBipsSet\",\"inputs\":[{\"name\":\"oldGlobalCommissionBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"},{\"name\":\"newGlobalCommissionBips\",\"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\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PauserRegistrySet\",\"inputs\":[{\"name\":\"pauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"}],\"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\":\"structIRewardsCoordinator.RewardsSubmission\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.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\":\"structIRewardsCoordinator.RewardsSubmission\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.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}]", - Bin: "0x6101806040523480156200001257600080fd5b5060405162004593380380620045938339810160408190526200003591620002e4565b868686868686866200004885826200037e565b63ffffffff1615620000ed5760405162461bcd60e51b815260206004820152606060248201527f52657761726473436f6f7264696e61746f723a2047454e455349535f5245574160448201527f5244535f54494d455354414d50206d7573742062652061206d756c7469706c6560648201527f206f662043414c43554c4154494f4e5f494e54455256414c5f5345434f4e4453608482015260a4015b60405180910390fd5b620000fc62015180866200037e565b63ffffffff16156200019d5760405162461bcd60e51b815260206004820152605760248201527f52657761726473436f6f7264696e61746f723a2043414c43554c4154494f4e5f60448201527f494e54455256414c5f5345434f4e4453206d7573742062652061206d756c746960648201527f706c65206f6620534e415053484f545f434144454e4345000000000000000000608482015260a401620000e4565b6001600160a01b0396871661012052949095166101405263ffffffff92831660805290821660a052811660c05291821660e0521661010052620001df620001f2565b5050466101605250620003b09350505050565b600054610100900460ff16156200025c5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b6064820152608401620000e4565b60005460ff9081161015620002af576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b0381168114620002c757600080fd5b50565b805163ffffffff81168114620002df57600080fd5b919050565b600080600080600080600060e0888a0312156200030057600080fd5b87516200030d81620002b1565b60208901519097506200032081620002b1565b95506200033060408901620002ca565b94506200034060608901620002ca565b93506200035060808901620002ca565b92506200036060a08901620002ca565b91506200037060c08901620002ca565b905092959891949750929550565b600063ffffffff80841680620003a457634e487b7160e01b600052601260045260246000fd5b92169190910692915050565b60805160a05160c05160e0516101005161012051610140516101605161414c620004476000396000611a6b0152600081816104fd01526128d3015260006107bd015260008181610406015261270201526000818161033201526127ae0152600081816104d601526126b101526000818161071c0152612428015260008181610694015281816124df01526125ba015261414c6000f3fe608060405234801561001057600080fd5b50600436106102f05760003560e01c80637b8f8b051161019d578063d4540a55116100e9578063f698da25116100a2578063fabc1cbc1161007c578063fabc1cbc14610820578063fbf1e2c114610833578063fce36c7d14610846578063ff9f6cce1461085957600080fd5b8063f698da25146107f2578063f8cd8448146107fa578063f96abf2e1461080d57600080fd5b8063d4540a551461076c578063de02e5031461077f578063e221b24514610792578063e810ce21146107a5578063ea4d3c9b146107b8578063f2fde38b146107df57600080fd5b80639be3d4e411610156578063aebd8bae11610130578063aebd8bae146106c9578063bb7e451f146106f7578063bf21a8aa14610717578063c46db6061461073e57600080fd5b80639be3d4e4146106875780639d45c2811461068f578063a0169ddd146106b657600080fd5b80637b8f8b0514610602578063863cb9a91461060a578063865c69531461061d578063886f1195146106485780638da5cb5b1461065b5780639104c3191461066c57600080fd5b806337838ed01161025c57806358baaa3e116102155780635c975abb116101ef5780635c975abb146105b15780635e9d8348146105b95780636d21117e146105cc578063715018a6146105fa57600080fd5b806358baaa3e14610573578063595c6a67146105865780635ac86ab71461058e57600080fd5b806337838ed0146104d157806339b70e38146104f85780633a8c07861461051f5780633ccc861d146105365780633efe1db6146105495780634d18cc351461055c57600080fd5b8063131433b4116102ae578063131433b414610401578063136439dd14610428578063149bc8721461043b57806322f19a641461045c5780632b9f64a41461047d57806336af41fa146104be57600080fd5b806218572c146102f557806304a0c5021461032d578063092db007146103695780630e9a53cf146103915780630eb38345146103d957806310d67a2f146103ee575b600080fd5b61031861030336600461375e565b60d16020526000908152604090205460ff1681565b60405190151581526020015b60405180910390f35b6103547f000000000000000000000000000000000000000000000000000000000000000081565b60405163ffffffff9091168152602001610324565b60cb5461037e90600160e01b900461ffff1681565b60405161ffff9091168152602001610324565b61039961086c565b604080518251815260208084015163ffffffff90811691830191909152838301511691810191909152606091820151151591810191909152608001610324565b6103ec6103e7366004613789565b61094b565b005b6103ec6103fc36600461375e565b6109cd565b6103547f000000000000000000000000000000000000000000000000000000000000000081565b6103ec6104363660046137c2565b610a89565b61044e6104493660046137f3565b610bc8565b604051908152602001610324565b61037e61046a36600461380f565b505060cb54600160e01b900461ffff1690565b6104a661048b36600461375e565b60cc602052600090815260409020546001600160a01b031681565b6040516001600160a01b039091168152602001610324565b6103ec6104cc36600461383d565b610c3e565b6103547f000000000000000000000000000000000000000000000000000000000000000081565b6104a67f000000000000000000000000000000000000000000000000000000000000000081565b60cb5461035490600160a01b900463ffffffff1681565b6103ec6105443660046138c5565b610e08565b6103ec610557366004613925565b6111cc565b60cb5461035490600160c01b900463ffffffff1681565b6103ec610581366004613951565b61149d565b6103ec6114ae565b61031861059c36600461396c565b606654600160ff9092169190911b9081161490565b60665461044e565b6103186105c736600461398f565b611575565b6103186105da3660046139c4565b60cf60209081526000928352604080842090915290825290205460ff1681565b6103ec611602565b60ca5461044e565b6103ec61061836600461375e565b611616565b61044e61062b36600461380f565b60cd60209081526000928352604080842090915290825290205481565b6065546104a6906001600160a01b031681565b6033546001600160a01b03166104a6565b6104a673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac081565b610399611627565b6103547f000000000000000000000000000000000000000000000000000000000000000081565b6103ec6106c436600461375e565b6116c5565b6103186106d73660046139c4565b60d260209081526000928352604080842090915290825290205460ff1681565b61044e61070536600461375e565b60ce6020526000908152604090205481565b6103547f000000000000000000000000000000000000000000000000000000000000000081565b61031861074c3660046139c4565b60d060209081526000928352604080842090915290825290205460ff1681565b6103ec61077a366004613a0d565b611724565b61039961078d3660046137c2565b61186c565b6103ec6107a0366004613a80565b6118fe565b6103546107b33660046137c2565b61190f565b6104a67f000000000000000000000000000000000000000000000000000000000000000081565b6103ec6107ed36600461375e565b6119f1565b61044e611a67565b61044e6108083660046137f3565b611aa5565b6103ec61081b366004613951565b611ab6565b6103ec61082e3660046137c2565b611cec565b60cb546104a6906001600160a01b031681565b6103ec61085436600461383d565b611e48565b6103ec61086736600461383d565b611fc7565b60408051608081018252600080825260208201819052918101829052606081019190915260ca545b801561094757600060ca6108a9600184613ab1565b815481106108b9576108b9613ac8565b600091825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff1615801560608301819052919250906109295750806040015163ffffffff164210155b156109345792915050565b508061093f81613ade565b915050610894565b5090565b610953612175565b6001600160a01b038216600081815260d1602052604080822054905160ff9091169284151592841515927f4de6293e668df1398422e1def12118052c1539a03cbfedc145895d48d7685f1c9190a4506001600160a01b0391909116600090815260d160205260409020805460ff1916911515919091179055565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a20573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a449190613af5565b6001600160a01b0316336001600160a01b031614610a7d5760405162461bcd60e51b8152600401610a7490613b12565b60405180910390fd5b610a86816121cf565b50565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015610ad1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610af59190613b5c565b610b115760405162461bcd60e51b8152600401610a7490613b79565b60665481811614610b8a5760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c69747900000000000000006064820152608401610a74565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b600080610bd8602084018461375e565b8360200135604051602001610c219392919060f89390931b6001600160f81b031916835260609190911b6bffffffffffffffffffffffff19166001830152601582015260350190565b604051602081830303815290604052805190602001209050919050565b60665460019060029081161415610c675760405162461bcd60e51b8152600401610a7490613bc1565b33600090815260d1602052604090205460ff16610c965760405162461bcd60e51b8152600401610a7490613bf8565b60026097541415610cb95760405162461bcd60e51b8152600401610a7490613c6f565b600260975560005b82811015610dfd5736848483818110610cdc57610cdc613ac8565b9050602002810190610cee9190613ca6565b33600081815260ce60209081526040808320549051949550939192610d199290918591879101613deb565b604051602081830303815290604052805190602001209050610d3a836122c6565b33600090815260d0602090815260408083208484529091529020805460ff19166001908117909155610d6d908390613e1b565b33600081815260ce602052604090819020929092559051829184917f51088b8c89628df3a8174002c2a034d0152fce6af8415d651b2a4734bf27048290610db5908890613e33565b60405180910390a4610de7333060408601803590610dd6906020890161375e565b6001600160a01b0316929190612a9e565b5050508080610df590613e46565b915050610cc1565b505060016097555050565b60665460029060049081161415610e315760405162461bcd60e51b8152600401610a7490613bc1565b60026097541415610e545760405162461bcd60e51b8152600401610a7490613c6f565b6002609755600060ca610e6a6020860186613951565b63ffffffff1681548110610e8057610e80613ac8565b600091825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff16151560608201529050610ee18482612b0f565b6000610ef3608086016060870161375e565b6001600160a01b03808216600090815260cc60205260409020549192501680610f195750805b336001600160a01b03821614610f975760405162461bcd60e51b815260206004820152603c60248201527f52657761726473436f6f7264696e61746f722e70726f63657373436c61696d3a60448201527f2063616c6c6572206973206e6f742076616c696420636c61696d6572000000006064820152608401610a74565b60005b610fa760a0880188613e61565b90508110156111be5736610fbe60e0890189613eb2565b83818110610fce57610fce613ac8565b6001600160a01b038716600090815260cd6020908152604080832093029490940194509290915082906110039085018561375e565b6001600160a01b03166001600160a01b03168152602001908152602001600020549050808260200135116110bd5760405162461bcd60e51b815260206004820152605560248201527f52657761726473436f6f7264696e61746f722e70726f63657373436c61696d3a60448201527f2063756d756c61746976654561726e696e6773206d75737420626520677420746064820152741a185b8818dd5b5d5b185d1a5d9950db185a5b5959605a1b608482015260a401610a74565b60006110cd826020850135613ab1565b6001600160a01b038716600090815260cd602090815260408220929350850180359291906110fb908761375e565b6001600160a01b031681526020808201929092526040016000209190915561113d908a90839061112d9087018761375e565b6001600160a01b03169190612ddb565b86516001600160a01b03808b1691878216918916907f9543dbd55580842586a951f0386e24d68a5df99ae29e3b216588b45fd684ce3190611181602089018961375e565b604080519283526001600160a01b039091166020830152810186905260600160405180910390a450505080806111b690613e46565b915050610f9a565b505060016097555050505050565b606654600390600890811614156111f55760405162461bcd60e51b8152600401610a7490613bc1565b60cb546001600160a01b0316331461121f5760405162461bcd60e51b8152600401610a7490613efc565b60cb5463ffffffff600160c01b9091048116908316116112bb5760405162461bcd60e51b815260206004820152604b60248201527f52657761726473436f6f7264696e61746f722e7375626d6974526f6f743a206e60448201527f657720726f6f74206d75737420626520666f72206e657765722063616c63756c60648201526a185d1959081c195c9a5bd960aa1b608482015260a401610a74565b428263ffffffff16106113545760405162461bcd60e51b815260206004820152605560248201527f52657761726473436f6f7264696e61746f722e7375626d6974526f6f743a207260448201527f65776172647343616c63756c6174696f6e456e6454696d657374616d702063616064820152746e6e6f7420626520696e207468652066757475726560581b608482015260a401610a74565b60ca5460cb5460009061137490600160a01b900463ffffffff1642613f50565b6040805160808101825287815263ffffffff878116602080840182815286841685870181815260006060880181815260ca8054600181018255925297517f42d72674974f694b5f5159593243114d38a5c39c89d6b62fee061ff523240ee160029092029182015592517f42d72674974f694b5f5159593243114d38a5c39c89d6b62fee061ff523240ee290930180549151975193871667ffffffffffffffff1990921691909117600160201b978716979097029690961760ff60401b1916600160401b921515929092029190911790945560cb805463ffffffff60c01b1916600160c01b840217905593519283529394508892908616917fecd866c3c158fa00bf34d803d5f6023000b57080bcb48af004c2b4b46b3afd08910160405180910390a45050505050565b6114a5612175565b610a8681612e0b565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa1580156114f6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061151a9190613b5c565b6115365760405162461bcd60e51b8152600401610a7490613b79565b600019606681905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b60006115fa8260ca61158a6020830183613951565b63ffffffff16815481106115a0576115a0613ac8565b600091825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff1615156060820152612b0f565b506001919050565b61160a612175565b6116146000612e7c565b565b61161e612175565b610a8681612ece565b60408051608081018252600080825260208201819052918101829052606081019190915260ca805461165b90600190613ab1565b8154811061166b5761166b613ac8565b600091825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff1615156060820152919050565b33600081815260cc602052604080822080546001600160a01b031981166001600160a01b038781169182179093559251911692839185917fbab947934d42e0ad206f25c9cab18b5bb6ae144acfb00f40b4e3aa59590ca31291a4505050565b600054610100900460ff16158080156117445750600054600160ff909116105b8061175e5750303b15801561175e575060005460ff166001145b6117c15760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610a74565b6000805460ff1916600117905580156117e4576000805461ff0019166101001790555b6117ec612f2a565b60c9556117f98686612fc1565b61180287612e7c565b61180b84612ece565b61181483612e0b565b61181d826130ab565b8015611863576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b60408051608081018252600080825260208201819052918101829052606081019190915260ca82815481106118a3576118a3613ac8565b600091825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff161515606082015292915050565b611906612175565b610a86816130ab565b60ca546000905b63ffffffff811615611982578260ca611930600184613f78565b63ffffffff168154811061194657611946613ac8565b906000526020600020906002020160000154141561197057611969600182613f78565b9392505050565b8061197a81613f9d565b915050611916565b5060405162461bcd60e51b815260206004820152603760248201527f52657761726473436f6f7264696e61746f722e676574526f6f74496e6465784660448201527f726f6d486173683a20726f6f74206e6f7420666f756e640000000000000000006064820152608401610a74565b6119f9612175565b6001600160a01b038116611a5e5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a74565b610a8681612e7c565b60007f0000000000000000000000000000000000000000000000000000000000000000461415611a98575060c95490565b611aa0612f2a565b905090565b60006001610bd8602084018461375e565b60665460039060089081161415611adf5760405162461bcd60e51b8152600401610a7490613bc1565b60cb546001600160a01b03163314611b095760405162461bcd60e51b8152600401610a7490613efc565b60ca5463ffffffff831610611b7a5760405162461bcd60e51b815260206004820152603160248201527f52657761726473436f6f7264696e61746f722e64697361626c65526f6f743a206044820152700d2dcecc2d8d2c840e4dedee892dcc8caf607b1b6064820152608401610a74565b600060ca8363ffffffff1681548110611b9557611b95613ac8565b906000526020600020906002020190508060010160089054906101000a900460ff1615611c225760405162461bcd60e51b815260206004820152603560248201527f52657761726473436f6f7264696e61746f722e64697361626c65526f6f743a206044820152741c9bdbdd08185b1c9958591e48191a5cd8589b1959605a1b6064820152608401610a74565b6001810154600160201b900463ffffffff164210611ca15760405162461bcd60e51b815260206004820152603660248201527f52657761726473436f6f7264696e61746f722e64697361626c65526f6f743a206044820152751c9bdbdd08185b1c9958591e481858dd1a5d985d195960521b6064820152608401610a74565b60018101805460ff60401b1916600160401b17905560405163ffffffff8416907fd850e6e5dfa497b72661fa73df2923464eaed9dc2ff1d3cb82bccbfeabe5c41e90600090a2505050565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611d3f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d639190613af5565b6001600160a01b0316336001600160a01b031614611d935760405162461bcd60e51b8152600401610a7490613b12565b606654198119606654191614611e115760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c69747900000000000000006064820152608401610a74565b606681905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c90602001610bbd565b60665460009060019081161415611e715760405162461bcd60e51b8152600401610a7490613bc1565b60026097541415611e945760405162461bcd60e51b8152600401610a7490613c6f565b600260975560005b82811015610dfd5736848483818110611eb757611eb7613ac8565b9050602002810190611ec99190613ca6565b33600081815260ce60209081526040808320549051949550939192611ef49290918591879101613deb565b604051602081830303815290604052805190602001209050611f15836122c6565b33600090815260cf602090815260408083208484529091529020805460ff19166001908117909155611f48908390613e1b565b33600081815260ce602052604090819020929092559051829184917f450a367a380c4e339e5ae7340c8464ef27af7781ad9945cfe8abd828f89e628190611f90908890613e33565b60405180910390a4611fb1333060408601803590610dd6906020890161375e565b5050508080611fbf90613e46565b915050611e9c565b60665460049060109081161415611ff05760405162461bcd60e51b8152600401610a7490613bc1565b33600090815260d1602052604090205460ff1661201f5760405162461bcd60e51b8152600401610a7490613bf8565b600260975414156120425760405162461bcd60e51b8152600401610a7490613c6f565b600260975560005b82811015610dfd573684848381811061206557612065613ac8565b90506020028101906120779190613ca6565b33600081815260ce602090815260408083205490519495509391926120a29290918591879101613deb565b6040516020818303038152906040528051906020012090506120c3836122c6565b33600090815260d2602090815260408083208484529091529020805460ff191660019081179091556120f6908390613e1b565b33600081815260ce602052604090819020929092559051829184917f5251b6fdefcb5d81144e735f69ea4c695fd43b0289ca53dc075033f5fc80068b9061213e908890613e33565b60405180910390a461215f333060408601803590610dd6906020890161375e565b505050808061216d90613e46565b91505061204a565b6033546001600160a01b031633146116145760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a74565b6001600160a01b03811661225d5760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a401610a74565b606554604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1606580546001600160a01b0319166001600160a01b0392909216919091179055565b60006122d28280613eb2565b905011612337576040805162461bcd60e51b81526020600482015260248101919091526000805160206140f783398151915260448201527f7264735375626d697373696f6e3a206e6f2073747261746567696573207365746064820152608401610a74565b60008160400135116123a95760405162461bcd60e51b815260206004820152604160248201526000805160206140f783398151915260448201527f7264735375626d697373696f6e3a20616d6f756e742063616e6e6f74206265206064820152600360fc1b608482015260a401610a74565b6f4b3b4ca85a86c47a098a223fffffffff816040013511156124215760405162461bcd60e51b815260206004820152603f60248201526000805160206140f783398151915260448201527f7264735375626d697373696f6e3a20616d6f756e7420746f6f206c61726765006064820152608401610a74565b63ffffffff7f00000000000000000000000000000000000000000000000000000000000000001661245860a0830160808401613951565b63ffffffff1611156124dd5760405162461bcd60e51b815260206004820152605460248201526000805160206140f783398151915260448201527f7264735375626d697373696f6e3a206475726174696f6e20657863656564732060648201527326a0ac2fa922aba0a92229afa22aa920aa24a7a760611b608482015260a401610a74565b7f000000000000000000000000000000000000000000000000000000000000000061250e60a0830160808401613951565b6125189190613fd3565b63ffffffff16156125b85760405162461bcd60e51b815260206004820152606a60248201526000805160206140f783398151915260448201527f7264735375626d697373696f6e3a206475726174696f6e206d7573742062652060648201527f61206d756c7469706c65206f662043414c43554c4154494f4e5f494e54455256608482015269414c5f5345434f4e445360b01b60a482015260c401610a74565b7f00000000000000000000000000000000000000000000000000000000000000006125e96080830160608401613951565b6125f39190613fd3565b63ffffffff16156126995760405162461bcd60e51b815260206004820152607060248201526000805160206140f783398151915260448201527f7264735375626d697373696f6e3a20737461727454696d657374616d70206d7560648201527f73742062652061206d756c7469706c65206f662043414c43554c4154494f4e5f60848201526f494e54455256414c5f5345434f4e445360801b60a482015260c401610a74565b6126a96080820160608301613951565b63ffffffff167f000000000000000000000000000000000000000000000000000000000000000063ffffffff16426126e19190613ab1565b1115801561272a57506126fa6080820160608301613951565b63ffffffff167f000000000000000000000000000000000000000000000000000000000000000063ffffffff1611155b6127a45760405162461bcd60e51b815260206004820152605160248201526000805160206140f783398151915260448201527f7264735375626d697373696f6e3a20737461727454696d657374616d7020746f6064820152701bc819985c881a5b881d1a19481c185cdd607a1b608482015260a401610a74565b6127d463ffffffff7f00000000000000000000000000000000000000000000000000000000000000001642613e1b565b6127e46080830160608401613951565b63ffffffff1611156128685760405162461bcd60e51b815260206004820152605360248201526000805160206140f783398151915260448201527f7264735375626d697373696f6e3a20737461727454696d657374616d7020746f6064820152726f2066617220696e207468652066757475726560681b608482015260a401610a74565b6000805b6128768380613eb2565b9050811015612a9957600061288b8480613eb2565b8381811061289b5761289b613ac8565b6128b1926020604090920201908101915061375e565b60405163198f077960e21b81526001600160a01b0380831660048301529192507f00000000000000000000000000000000000000000000000000000000000000009091169063663c1de490602401602060405180830381865afa15801561291c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129409190613b5c565b8061296757506001600160a01b03811673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac0145b6129da5760405162461bcd60e51b815260206004820152604a60248201526000805160206140f783398151915260448201527f7264735375626d697373696f6e3a20696e76616c69642073747261746567792060648201526918dbdb9cda59195c995960b21b608482015260a401610a74565b806001600160a01b0316836001600160a01b031610612a875760405162461bcd60e51b815260206004820152606960248201526000805160206140f783398151915260448201527f7264735375626d697373696f6e3a2073747261746567696573206d757374206260648201527f6520696e20617363656e64696e67206f7264657220746f2068616e646c65206460848201526875706c69636174657360b81b60a482015260c401610a74565b9150612a9281613e46565b905061286c565b505050565b6040516001600160a01b0380851660248301528316604482015260648101829052612b099085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152613116565b50505050565b806060015115612b685760405162461bcd60e51b815260206004820152603060248201526000805160206140d783398151915260448201526f1c9bdbdd081a5cc8191a5cd8589b195960821b6064820152608401610a74565b806040015163ffffffff16421015612bcf5760405162461bcd60e51b815260206004820152603660248201526000805160206140d78339815191526044820152751c9bdbdd081b9bdd081858dd1a5d985d1959081e595d60521b6064820152608401610a74565b612bdc60c0830183613e61565b9050612beb60a0840184613e61565b905014612c635760405162461bcd60e51b815260206004820152604c60248201526000805160206140d783398151915260448201527f746f6b656e496e646963657320616e6420746f6b656e50726f6f6673206c656e60648201526b0cee8d040dad2e6dac2e8c6d60a31b608482015260a401610a74565b612c7060e0830183613eb2565b9050612c7f60c0840184613e61565b905014612cf55760405162461bcd60e51b815260206004820152604a60248201526000805160206140d783398151915260448201527f746f6b656e5472656550726f6f667320616e64206c6561766573206c656e67746064820152690d040dad2e6dac2e8c6d60b31b608482015260a401610a74565b8051612d2190612d0b6040850160208601613951565b612d186040860186613ff6565b866060016131e8565b60005b612d3160a0840184613e61565b9050811015612a9957612dcb6080840135612d4f60a0860186613e61565b84818110612d5f57612d5f613ac8565b9050602002016020810190612d749190613951565b612d8160c0870187613e61565b85818110612d9157612d91613ac8565b9050602002810190612da39190613ff6565b612db060e0890189613eb2565b87818110612dc057612dc0613ac8565b90506040020161335c565b612dd481613e46565b9050612d24565b6040516001600160a01b038316602482015260448101829052612a9990849063a9059cbb60e01b90606401612ad2565b60cb546040805163ffffffff600160a01b9093048316815291831660208301527faf557c6c02c208794817a705609cfa935f827312a1adfdd26494b6b95dd2b4b3910160405180910390a160cb805463ffffffff909216600160a01b0263ffffffff60a01b19909216919091179055565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60cb546040516001600160a01b038084169216907f237b82f438d75fc568ebab484b75b01d9287b9e98b490b7c23221623b6705dbb90600090a360cb80546001600160a01b0319166001600160a01b0392909216919091179055565b604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b6065546001600160a01b0316158015612fe257506001600160a01b03821615155b6130645760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a401610a74565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a26130a7826121cf565b5050565b60cb546040805161ffff600160e01b9093048316815291831660208301527f8cdc428b0431b82d1619763f443a48197db344ba96905f3949643acd1c863a06910160405180910390a160cb805461ffff909216600160e01b0261ffff60e01b19909216919091179055565b600061316b826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166134ad9092919063ffffffff16565b805190915015612a9957808060200190518101906131899190613b5c565b612a995760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610a74565b6131f360208361403d565b6001901b8463ffffffff161061327d5760405162461bcd60e51b815260206004820152604360248201527f52657761726473436f6f7264696e61746f722e5f7665726966794561726e657260448201527f436c61696d50726f6f663a20696e76616c6964206561726e65724c656166496e6064820152620c8caf60eb1b608482015260a401610a74565b600061328882610bc8565b90506132d384848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508a92508591505063ffffffff89166134c4565b6133545760405162461bcd60e51b815260206004820152604660248201527f52657761726473436f6f7264696e61746f722e5f7665726966794561726e657260448201527f436c61696d50726f6f663a20696e76616c6964206561726e657220636c61696d60648201526510383937b7b360d11b608482015260a401610a74565b505050505050565b61336760208361403d565b6001901b8463ffffffff16106133e55760405162461bcd60e51b815260206004820152603c60248201527f52657761726473436f6f7264696e61746f722e5f766572696679546f6b656e4360448201527f6c61696d3a20696e76616c696420746f6b656e4c656166496e646578000000006064820152608401610a74565b60006133f082611aa5565b905061343b84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508a92508591505063ffffffff89166134c4565b6133545760405162461bcd60e51b815260206004820152603f60248201527f52657761726473436f6f7264696e61746f722e5f766572696679546f6b656e4360448201527f6c61696d3a20696e76616c696420746f6b656e20636c61696d2070726f6f66006064820152608401610a74565b60606134bc84846000856134dc565b949350505050565b6000836134d286858561360d565b1495945050505050565b60608247101561353d5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610a74565b6001600160a01b0385163b6135945760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610a74565b600080866001600160a01b031685876040516135b0919061407d565b60006040518083038185875af1925050503d80600081146135ed576040519150601f19603f3d011682016040523d82523d6000602084013e6135f2565b606091505b5091509150613602828286613710565b979650505050505050565b60006020845161361d919061408f565b156136a45760405162461bcd60e51b815260206004820152604b60248201527f4d65726b6c652e70726f63657373496e636c7573696f6e50726f6f664b65636360448201527f616b3a2070726f6f66206c656e6774682073686f756c642062652061206d756c60648201526a3a34b836329037b310199960a91b608482015260a401610a74565b8260205b85518111613707576136bb60028561408f565b6136dc578160005280860151602052604060002091506002840493506136f5565b8086015160005281602052604060002091506002840493505b613700602082613e1b565b90506136a8565b50949350505050565b6060831561371f575081611969565b82511561372f5782518084602001fd5b8160405162461bcd60e51b8152600401610a7491906140a3565b6001600160a01b0381168114610a8657600080fd5b60006020828403121561377057600080fd5b813561196981613749565b8015158114610a8657600080fd5b6000806040838503121561379c57600080fd5b82356137a781613749565b915060208301356137b78161377b565b809150509250929050565b6000602082840312156137d457600080fd5b5035919050565b6000604082840312156137ed57600080fd5b50919050565b60006040828403121561380557600080fd5b61196983836137db565b6000806040838503121561382257600080fd5b823561382d81613749565b915060208301356137b781613749565b6000806020838503121561385057600080fd5b823567ffffffffffffffff8082111561386857600080fd5b818501915085601f83011261387c57600080fd5b81358181111561388b57600080fd5b8660208260051b85010111156138a057600080fd5b60209290920196919550909350505050565b600061010082840312156137ed57600080fd5b600080604083850312156138d857600080fd5b823567ffffffffffffffff8111156138ef57600080fd5b6138fb858286016138b2565b92505060208301356137b781613749565b803563ffffffff8116811461392057600080fd5b919050565b6000806040838503121561393857600080fd5b823591506139486020840161390c565b90509250929050565b60006020828403121561396357600080fd5b6119698261390c565b60006020828403121561397e57600080fd5b813560ff8116811461196957600080fd5b6000602082840312156139a157600080fd5b813567ffffffffffffffff8111156139b857600080fd5b6134bc848285016138b2565b600080604083850312156139d757600080fd5b82356139e281613749565b946020939093013593505050565b803561392081613749565b803561ffff8116811461392057600080fd5b60008060008060008060c08789031215613a2657600080fd5b8635613a3181613749565b95506020870135613a4181613749565b9450604087013593506060870135613a5881613749565b9250613a666080880161390c565b9150613a7460a088016139fb565b90509295509295509295565b600060208284031215613a9257600080fd5b611969826139fb565b634e487b7160e01b600052601160045260246000fd5b600082821015613ac357613ac3613a9b565b500390565b634e487b7160e01b600052603260045260246000fd5b600081613aed57613aed613a9b565b506000190190565b600060208284031215613b0757600080fd5b815161196981613749565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b600060208284031215613b6e57600080fd5b81516119698161377b565b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b60208082526019908201527f5061757361626c653a20696e6465782069732070617573656400000000000000604082015260600190565b60208082526051908201527f52657761726473436f6f7264696e61746f723a2063616c6c6572206973206e6f60408201527f7420612076616c69642063726561746552657761726473466f72416c6c53756260608201527036b4b9b9b4b7b71039bab136b4ba3a32b960791b608082015260a00190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b60008235609e19833603018112613cbc57600080fd5b9190910192915050565b818352600060208085019450826000805b86811015613d2b578235613cea81613749565b6001600160a01b03168852828401356bffffffffffffffffffffffff8116808214613d13578384fd5b89860152506040978801979290920191600101613cd7565b50959695505050505050565b60008135601e19833603018112613d4d57600080fd5b8201803567ffffffffffffffff811115613d6657600080fd5b8060061b3603841315613d7857600080fd5b60a08552613d8d60a086018260208501613cc6565b915050613d9c602084016139f0565b6001600160a01b0316602085015260408381013590850152613dc06060840161390c565b63ffffffff166060850152613dd76080840161390c565b63ffffffff81166080860152509392505050565b60018060a01b0384168152826020820152606060408201526000613e126060830184613d37565b95945050505050565b60008219821115613e2e57613e2e613a9b565b500190565b6020815260006119696020830184613d37565b6000600019821415613e5a57613e5a613a9b565b5060010190565b6000808335601e19843603018112613e7857600080fd5b83018035915067ffffffffffffffff821115613e9357600080fd5b6020019150600581901b3603821315613eab57600080fd5b9250929050565b6000808335601e19843603018112613ec957600080fd5b83018035915067ffffffffffffffff821115613ee457600080fd5b6020019150600681901b3603821315613eab57600080fd5b60208082526034908201527f52657761726473436f6f7264696e61746f723a2063616c6c6572206973206e6f6040820152733a103a3432903932bbb0b93239aab83230ba32b960611b606082015260800190565b600063ffffffff808316818516808303821115613f6f57613f6f613a9b565b01949350505050565b600063ffffffff83811690831681811015613f9557613f95613a9b565b039392505050565b600063ffffffff821680613fb357613fb3613a9b565b6000190192915050565b634e487b7160e01b600052601260045260246000fd5b600063ffffffff80841680613fea57613fea613fbd565b92169190910692915050565b6000808335601e1984360301811261400d57600080fd5b83018035915067ffffffffffffffff82111561402857600080fd5b602001915036819003821315613eab57600080fd5b60008261404c5761404c613fbd565b500490565b60005b8381101561406c578181015183820152602001614054565b83811115612b095750506000910152565b60008251613cbc818460208701614051565b60008261409e5761409e613fbd565b500690565b60208152600082518060208401526140c2816040850160208701614051565b601f01601f1916919091016040019291505056fe52657761726473436f6f7264696e61746f722e5f636865636b436c61696d3a2052657761726473436f6f7264696e61746f722e5f76616c696461746552657761a264697066735822122036f8834ea90be93d8ffaadfdccbc5c85edd0361a90fe4b8b14a9345e0ebdd2e064736f6c634300080c0033", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_delegationManager\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"},{\"name\":\"_strategyManager\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"},{\"name\":\"_CALCULATION_INTERVAL_SECONDS\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_MAX_REWARDS_DURATION\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_MAX_RETROACTIVE_LENGTH\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_MAX_FUTURE_LENGTH\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"__GENESIS_REWARDS_TIMESTAMP\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"CALCULATION_INTERVAL_SECONDS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"GENESIS_REWARDS_TIMESTAMP\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_FUTURE_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_RETROACTIVE_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_REWARDS_DURATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activationDelay\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"beaconChainETHStrategy\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateEarnerLeafHash\",\"inputs\":[{\"name\":\"leaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.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\":\"structIRewardsCoordinator.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\":\"structIRewardsCoordinator.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\":\"structIRewardsCoordinator.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\":\"structIRewardsCoordinator.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\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"createAVSRewardsSubmission\",\"inputs\":[{\"name\":\"rewardsSubmissions\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.RewardsSubmission[]\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.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\":\"createRewardsForAllEarners\",\"inputs\":[{\"name\":\"rewardsSubmissions\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.RewardsSubmission[]\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.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\":\"structIRewardsCoordinator.RewardsSubmission[]\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.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\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"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\":\"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\":\"domainSeparator\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getCurrentClaimableDistributionRoot\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.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\":\"structIRewardsCoordinator.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\":\"structIRewardsCoordinator.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\":\"getRootIndexFromHash\",\"inputs\":[{\"name\":\"rootHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"globalOperatorCommissionBips\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"initialPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_rewardsUpdater\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_activationDelay\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_globalCommissionBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isAVSRewardsSubmissionHash\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isRewardsForAllSubmitter\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isRewardsSubmissionForAllEarnersHash\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isRewardsSubmissionForAllHash\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"operatorCommissionBips\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"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\":\"processClaim\",\"inputs\":[{\"name\":\"claim\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.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\":\"structIRewardsCoordinator.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\":\"structIRewardsCoordinator.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\":\"setGlobalOperatorCommission\",\"inputs\":[{\"name\":\"_globalCommissionBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setPauserRegistry\",\"inputs\":[{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"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\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"submitRoot\",\"inputs\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AVSRewardsSubmissionCreated\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"submissionNonce\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"rewardsSubmissionHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewardsSubmission\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIRewardsCoordinator.RewardsSubmission\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.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\":\"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\":\"GlobalCommissionBipsSet\",\"inputs\":[{\"name\":\"oldGlobalCommissionBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"},{\"name\":\"newGlobalCommissionBips\",\"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\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PauserRegistrySet\",\"inputs\":[{\"name\":\"pauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"}],\"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\":\"structIRewardsCoordinator.RewardsSubmission\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.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\":\"structIRewardsCoordinator.RewardsSubmission\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsUpdaterSet\",\"inputs\":[{\"name\":\"oldRewardsUpdater\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newRewardsUpdater\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AmountExceedsMax\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"AmountIsZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CurrentlyPaused\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"DurationExceedsMax\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"EarningsNotGreaterThanClaimed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputArrayLengthMismatch\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputArrayLengthZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidClaimProof\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDurationRemainder\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidEarnerLeafIndex\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNewPausedStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidProofLength\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidRoot\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidRootIndex\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStartTimestampRemainder\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidTokenLeafIndex\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NewRootMustBeForNewCalculatedPeriod\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyPauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnpauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RewardsEndTimestampNotElapsed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RootAlreadyActivated\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RootDisabled\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RootNotActivated\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StartTimestampTooFarInFuture\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StartTimestampTooFarInPast\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategiesNotInAscendingOrder\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyNotWhitelisted\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UnauthorizedCaller\",\"inputs\":[]}]", + Bin: "0x61018060405234801561001157600080fd5b506040516137c73803806137c7833981016040819052610030916102d0565b86868686868686610041858261035b565b63ffffffff16156100e55760405162461bcd60e51b815260206004820152606060248201527f52657761726473436f6f7264696e61746f723a2047454e455349535f5245574160448201527f5244535f54494d455354414d50206d7573742062652061206d756c7469706c6560648201527f206f662043414c43554c4154494f4e5f494e54455256414c5f5345434f4e4453608482015260a4015b60405180910390fd5b6100f2620151808661035b565b63ffffffff16156101915760405162461bcd60e51b815260206004820152605760248201527f52657761726473436f6f7264696e61746f723a2043414c43554c4154494f4e5f60448201527f494e54455256414c5f5345434f4e4453206d7573742062652061206d756c746960648201527f706c65206f6620534e415053484f545f434144454e4345000000000000000000608482015260a4016100dc565b6001600160a01b0396871661012052949095166101405263ffffffff92831660805290821660a052811660c05291821660e05216610100526101d16101e3565b50504661016052506103919350505050565b600054610100900460ff161561024b5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b60648201526084016100dc565b60005460ff908116101561029d576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146102b457600080fd5b50565b805163ffffffff811681146102cb57600080fd5b919050565b600080600080600080600060e0888a0312156102eb57600080fd5b87516102f68161029f565b60208901519097506103078161029f565b9550610315604089016102b7565b9450610323606089016102b7565b9350610331608089016102b7565b925061033f60a089016102b7565b915061034d60c089016102b7565b905092959891949750929550565b600063ffffffff83168061037f57634e487b7160e01b600052601260045260246000fd5b8063ffffffff84160691505092915050565b60805160a05160c05160e051610100516101205161014051610160516133a061042760003960006118160152600081816104f501526121d9015260006107b501526000818161040c01526120c401526000818161033201526121130152600081816104ce01526120730152600081816107140152611f4801526000818161068c01528181611f9f0152611ffe01526133a06000f3fe608060405234801561001057600080fd5b50600436106102f05760003560e01c80637b8f8b051161019d578063d4540a55116100e9578063f698da25116100a2578063fabc1cbc1161007c578063fabc1cbc14610818578063fbf1e2c11461082b578063fce36c7d1461083e578063ff9f6cce1461085157600080fd5b8063f698da25146107ea578063f8cd8448146107f2578063f96abf2e1461080557600080fd5b8063d4540a5514610764578063de02e50314610777578063e221b2451461078a578063e810ce211461079d578063ea4d3c9b146107b0578063f2fde38b146107d757600080fd5b80639be3d4e411610156578063aebd8bae11610130578063aebd8bae146106c1578063bb7e451f146106ef578063bf21a8aa1461070f578063c46db6061461073657600080fd5b80639be3d4e41461067f5780639d45c28114610687578063a0169ddd146106ae57600080fd5b80637b8f8b05146105fa578063863cb9a914610602578063865c695314610615578063886f1195146106405780638da5cb5b146106535780639104c3191461066457600080fd5b806337838ed01161025c57806358baaa3e116102155780635c975abb116101ef5780635c975abb146105a95780635e9d8348146105b15780636d21117e146105c4578063715018a6146105f257600080fd5b806358baaa3e1461056b578063595c6a671461057e5780635ac86ab71461058657600080fd5b806337838ed0146104c957806339b70e38146104f05780633a8c0786146105175780633ccc861d1461052e5780633efe1db6146105415780634d18cc351461055457600080fd5b8063131433b4116102ae578063131433b414610407578063136439dd1461042e578063149bc8721461044157806322f19a64146104625780632b9f64a41461047557806336af41fa146104b657600080fd5b806218572c146102f557806304a0c5021461032d578063092db007146103695780630e9a53cf146103915780630eb38345146103df57806310d67a2f146103f4575b600080fd5b610318610303366004612bc0565b60d16020526000908152604090205460ff1681565b60405190151581526020015b60405180910390f35b6103547f000000000000000000000000000000000000000000000000000000000000000081565b60405163ffffffff9091168152602001610324565b60cb5461037e90600160e01b900461ffff1681565b60405161ffff9091168152602001610324565b610399610864565b604051610324919060006080820190508251825263ffffffff602084015116602083015263ffffffff604084015116604083015260608301511515606083015292915050565b6103f26103ed366004612beb565b610943565b005b6103f2610402366004612bc0565b6109c5565b6103547f000000000000000000000000000000000000000000000000000000000000000081565b6103f261043c366004612c24565b610a79565b61045461044f366004612c55565b610b64565b604051908152602001610324565b61037e610470366004612c71565b610bda565b61049e610483366004612bc0565b60cc602052600090815260409020546001600160a01b031681565b6040516001600160a01b039091168152602001610324565b6103f26104c4366004612c9f565b610bef565b6103547f000000000000000000000000000000000000000000000000000000000000000081565b61049e7f000000000000000000000000000000000000000000000000000000000000000081565b60cb5461035490600160a01b900463ffffffff1681565b6103f261053c366004612d29565b610db7565b6103f261054f366004612d89565b6110a7565b60cb5461035490600160c01b900463ffffffff1681565b6103f2610579366004612db5565b61129d565b6103f26112ae565b610318610594366004612dd0565b606654600160ff9092169190911b9081161490565b606654610454565b6103186105bf366004612df3565b611376565b6103186105d2366004612e28565b60cf60209081526000928352604080842090915290825290205460ff1681565b6103f2611403565b60ca54610454565b6103f2610610366004612bc0565b611417565b610454610623366004612c71565b60cd60209081526000928352604080842090915290825290205481565b60655461049e906001600160a01b031681565b6033546001600160a01b031661049e565b61049e73beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac081565b610399611428565b6103547f000000000000000000000000000000000000000000000000000000000000000081565b6103f26106bc366004612bc0565b6114c6565b6103186106cf366004612e28565b60d260209081526000928352604080842090915290825290205460ff1681565b6104546106fd366004612bc0565b60ce6020526000908152604090205481565b6103547f000000000000000000000000000000000000000000000000000000000000000081565b610318610744366004612e28565b60d060209081526000928352604080842090915290825290205460ff1681565b6103f2610772366004612e71565b611525565b610399610785366004612c24565b61166d565b6103f2610798366004612ee4565b6116ff565b6103546107ab366004612c24565b611710565b61049e7f000000000000000000000000000000000000000000000000000000000000000081565b6103f26107e5366004612bc0565b61179c565b610454611812565b610454610800366004612c55565b61184f565b6103f2610813366004612db5565b611860565b6103f2610826366004612c24565b6119b3565b60cb5461049e906001600160a01b031681565b6103f261084c366004612c9f565b611abb565b6103f261085f366004612c9f565b611c2e565b60408051608081018252600080825260208201819052918101829052606081019190915260ca545b801561093f57600060ca6108a1600184612f15565b815481106108b1576108b1612f28565b600091825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff1615801560608301819052919250906109215750806040015163ffffffff164210155b1561092c5792915050565b508061093781612f3e565b91505061088c565b5090565b61094b611dd1565b6001600160a01b038216600081815260d1602052604080822054905160ff9091169284151592841515927f4de6293e668df1398422e1def12118052c1539a03cbfedc145895d48d7685f1c9190a4506001600160a01b0391909116600090815260d160205260409020805460ff1916911515919091179055565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a18573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a3c9190612f55565b6001600160a01b0316336001600160a01b031614610a6d5760405163794821ff60e01b815260040160405180910390fd5b610a7681611e2b565b50565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015610ac1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ae59190612f72565b610b0257604051631d77d47760e21b815260040160405180910390fd5b60665481811614610b265760405163c61dca5d60e01b815260040160405180910390fd5b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b600080610b746020840184612bc0565b8360200135604051602001610bbd9392919060f89390931b6001600160f81b031916835260609190911b6bffffffffffffffffffffffff19166001830152601582015260350190565b604051602081830303815290604052805190602001209050919050565b60cb54600160e01b900461ffff165b92915050565b606654600190600290811603610c185760405163840a48d560e01b815260040160405180910390fd5b33600090815260d1602052604090205460ff16610c4857604051635c427cd960e01b815260040160405180910390fd5b600260975403610c735760405162461bcd60e51b8152600401610c6a90612f8f565b60405180910390fd5b600260975560005b82811015610dac5736848483818110610c9657610c96612f28565b9050602002810190610ca89190612fc6565b33600081815260ce60209081526040808320549051949550939192610cd3929091859187910161310b565b604051602081830303815290604052805190602001209050610cf483611ebb565b33600090815260d0602090815260408083208484529091529020805460ff19166001908117909155610d2790839061313b565b33600081815260ce602052604090819020929092559051829184917f51088b8c89628df3a8174002c2a034d0152fce6af8415d651b2a4734bf27048290610d6f90889061314e565b60405180910390a4610da1333060408601803590610d909060208901612bc0565b6001600160a01b03169291906122cb565b505050600101610c7b565b505060016097555050565b606654600290600490811603610de05760405163840a48d560e01b815260040160405180910390fd5b600260975403610e025760405162461bcd60e51b8152600401610c6a90612f8f565b6002609755600060ca610e186020860186612db5565b63ffffffff1681548110610e2e57610e2e612f28565b600091825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff16151560608201529050610e8f848261233c565b6000610ea16080860160608701612bc0565b6001600160a01b03808216600090815260cc60205260409020549192501680610ec75750805b336001600160a01b03821614610ef057604051635c427cd960e01b815260040160405180910390fd5b60005b610f0060a0880188613161565b90508110156110995736610f1760e08901896131b2565b83818110610f2757610f27612f28565b6001600160a01b038716600090815260cd602090815260408083209302949094019450929091508290610f5c90850185612bc0565b6001600160a01b03166001600160a01b0316815260200190815260200160002054905080826020013511610fa35760405163aa385e8160e01b815260040160405180910390fd5b6000610fb3826020850135612f15565b6001600160a01b038716600090815260cd60209081526040822092935085018035929190610fe19087612bc0565b6001600160a01b0316815260208082019290925260400160002091909155611023908a90839061101390870187612bc0565b6001600160a01b031691906124e0565b86516001600160a01b03808b1691878216918916907f9543dbd55580842586a951f0386e24d68a5df99ae29e3b216588b45fd684ce31906110676020890189612bc0565b604080519283526001600160a01b039091166020830152810186905260600160405180910390a4505050600101610ef3565b505060016097555050505050565b6066546003906008908116036110d05760405163840a48d560e01b815260040160405180910390fd5b60cb546001600160a01b031633146110fb57604051635c427cd960e01b815260040160405180910390fd5b60cb5463ffffffff600160c01b90910481169083161161112e57604051631ca7e50b60e21b815260040160405180910390fd5b428263ffffffff1610611154576040516306957c9160e11b815260040160405180910390fd5b60ca5460cb5460009061117490600160a01b900463ffffffff16426131fc565b6040805160808101825287815263ffffffff878116602080840182815286841685870181815260006060880181815260ca8054600181018255925297517f42d72674974f694b5f5159593243114d38a5c39c89d6b62fee061ff523240ee160029092029182015592517f42d72674974f694b5f5159593243114d38a5c39c89d6b62fee061ff523240ee290930180549151975193871667ffffffffffffffff1990921691909117600160201b978716979097029690961760ff60401b1916600160401b921515929092029190911790945560cb805463ffffffff60c01b1916600160c01b840217905593519283529394508892908616917fecd866c3c158fa00bf34d803d5f6023000b57080bcb48af004c2b4b46b3afd08910160405180910390a45050505050565b6112a5611dd1565b610a7681612510565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa1580156112f6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061131a9190612f72565b61133757604051631d77d47760e21b815260040160405180910390fd5b600019606681905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b60006113fb8260ca61138b6020830183612db5565b63ffffffff16815481106113a1576113a1612f28565b600091825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff161515606082015261233c565b506001919050565b61140b611dd1565b6114156000612581565b565b61141f611dd1565b610a76816125d3565b60408051608081018252600080825260208201819052918101829052606081019190915260ca805461145c90600190612f15565b8154811061146c5761146c612f28565b600091825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff1615156060820152919050565b33600081815260cc602052604080822080546001600160a01b031981166001600160a01b038781169182179093559251911692839185917fbab947934d42e0ad206f25c9cab18b5bb6ae144acfb00f40b4e3aa59590ca31291a4505050565b600054610100900460ff16158080156115455750600054600160ff909116105b8061155f5750303b15801561155f575060005460ff166001145b6115c25760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610c6a565b6000805460ff1916600117905580156115e5576000805461ff0019166101001790555b6115ed61262f565b60c9556115fa86866126c6565b61160387612581565b61160c846125d3565b61161583612510565b61161e8261274b565b8015611664576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b60408051608081018252600080825260208201819052918101829052606081019190915260ca82815481106116a4576116a4612f28565b600091825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff161515606082015292915050565b611707611dd1565b610a768161274b565b60ca546000905b63ffffffff811615611782578260ca611731600184613218565b63ffffffff168154811061174757611747612f28565b9060005260206000209060020201600001540361177057611769600182613218565b9392505050565b8061177a81613234565b915050611717565b5060405163504570e360e01b815260040160405180910390fd5b6117a4611dd1565b6001600160a01b0381166118095760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610c6a565b610a7681612581565b60007f00000000000000000000000000000000000000000000000000000000000000004603611842575060c95490565b61184a61262f565b905090565b60006001610b746020840184612bc0565b6066546003906008908116036118895760405163840a48d560e01b815260040160405180910390fd5b60cb546001600160a01b031633146118b457604051635c427cd960e01b815260040160405180910390fd5b60ca5463ffffffff8316106118dc576040516394a8d38960e01b815260040160405180910390fd5b600060ca8363ffffffff16815481106118f7576118f7612f28565b906000526020600020906002020190508060010160089054906101000a900460ff161561193757604051631b14174b60e01b815260040160405180910390fd5b6001810154600160201b900463ffffffff16421061196857604051630c36f66560e21b815260040160405180910390fd5b60018101805460ff60401b1916600160401b17905560405163ffffffff8416907fd850e6e5dfa497b72661fa73df2923464eaed9dc2ff1d3cb82bccbfeabe5c41e90600090a2505050565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a06573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a2a9190612f55565b6001600160a01b0316336001600160a01b031614611a5b5760405163794821ff60e01b815260040160405180910390fd5b606654198119606654191614611a845760405163c61dca5d60e01b815260040160405180910390fd5b606681905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c90602001610b59565b606654600090600190811603611ae45760405163840a48d560e01b815260040160405180910390fd5b600260975403611b065760405162461bcd60e51b8152600401610c6a90612f8f565b600260975560005b82811015610dac5736848483818110611b2957611b29612f28565b9050602002810190611b3b9190612fc6565b33600081815260ce60209081526040808320549051949550939192611b66929091859187910161310b565b604051602081830303815290604052805190602001209050611b8783611ebb565b33600090815260cf602090815260408083208484529091529020805460ff19166001908117909155611bba90839061313b565b33600081815260ce602052604090819020929092559051829184917f450a367a380c4e339e5ae7340c8464ef27af7781ad9945cfe8abd828f89e628190611c0290889061314e565b60405180910390a4611c23333060408601803590610d909060208901612bc0565b505050600101611b0e565b606654600490601090811603611c575760405163840a48d560e01b815260040160405180910390fd5b33600090815260d1602052604090205460ff16611c8757604051635c427cd960e01b815260040160405180910390fd5b600260975403611ca95760405162461bcd60e51b8152600401610c6a90612f8f565b600260975560005b82811015610dac5736848483818110611ccc57611ccc612f28565b9050602002810190611cde9190612fc6565b33600081815260ce60209081526040808320549051949550939192611d09929091859187910161310b565b604051602081830303815290604052805190602001209050611d2a83611ebb565b33600090815260d2602090815260408083208484529091529020805460ff19166001908117909155611d5d90839061313b565b33600081815260ce602052604090819020929092559051829184917f5251b6fdefcb5d81144e735f69ea4c695fd43b0289ca53dc075033f5fc80068b90611da590889061314e565b60405180910390a4611dc6333060408601803590610d909060208901612bc0565b505050600101611cb1565b6033546001600160a01b031633146114155760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c6a565b6001600160a01b038116611e52576040516339b190bb60e11b815260040160405180910390fd5b606554604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1606580546001600160a01b0319166001600160a01b0392909216919091179055565b6000611ec782806131b2565b905011611ee75760405163796cc52560e01b815260040160405180910390fd5b6000816040013511611f0c576040516310eb483f60e21b815260040160405180910390fd5b6f4b3b4ca85a86c47a098a223fffffffff81604001351115611f415760405163070b5a6f60e21b815260040160405180910390fd5b63ffffffff7f000000000000000000000000000000000000000000000000000000000000000016611f7860a0830160808401612db5565b63ffffffff161115611f9d57604051630dd0b9f560e21b815260040160405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000000611fce60a0830160808401612db5565b611fd8919061326a565b63ffffffff1615611ffc5760405163ee66470560e01b815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000061202d6080830160608401612db5565b612037919061326a565b63ffffffff161561205b57604051633c1a94f160e21b815260040160405180910390fd5b61206b6080820160608301612db5565b63ffffffff167f000000000000000000000000000000000000000000000000000000000000000063ffffffff16426120a39190612f15565b111580156120ec57506120bc6080820160608301612db5565b63ffffffff167f000000000000000000000000000000000000000000000000000000000000000063ffffffff1611155b6121095760405163041aa75760e11b815260040160405180910390fd5b61213963ffffffff7f0000000000000000000000000000000000000000000000000000000000000000164261313b565b6121496080830160608401612db5565b63ffffffff16111561216e57604051637ee2b44360e01b815260040160405180910390fd5b6000805b61217c83806131b2565b90508110156122c657600061219184806131b2565b838181106121a1576121a1612f28565b6121b79260206040909202019081019150612bc0565b60405163198f077960e21b81526001600160a01b0380831660048301529192507f00000000000000000000000000000000000000000000000000000000000000009091169063663c1de490602401602060405180830381865afa158015612222573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122469190612f72565b8061226d57506001600160a01b03811673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac0145b61228a57604051632efd965160e11b815260040160405180910390fd5b806001600160a01b0316836001600160a01b0316106122bc5760405163dfad9ca160e01b815260040160405180910390fd5b9150600101612172565b505050565b6040516001600160a01b03808516602483015283166044820152606481018290526123369085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526127b6565b50505050565b80606001511561235f57604051631b14174b60e01b815260040160405180910390fd5b806040015163ffffffff1642101561238a57604051631437a2bb60e31b815260040160405180910390fd5b61239760c0830183613161565b90506123a660a0840184613161565b9050146123c6576040516343714afd60e01b815260040160405180910390fd5b6123d360e08301836131b2565b90506123e260c0840184613161565b905014612402576040516343714afd60e01b815260040160405180910390fd5b805161242e906124186040850160208601612db5565b6124256040860186613292565b86606001612888565b60005b61243e60a0840184613161565b90508110156122c6576124d8608084013561245c60a0860186613161565b8481811061246c5761246c612f28565b90506020020160208101906124819190612db5565b61248e60c0870187613161565b8581811061249e5761249e612f28565b90506020028101906124b09190613292565b6124bd60e08901896131b2565b878181106124cd576124cd612f28565b905060400201612936565b600101612431565b6040516001600160a01b0383166024820152604481018290526122c690849063a9059cbb60e01b906064016122ff565b60cb546040805163ffffffff600160a01b9093048316815291831660208301527faf557c6c02c208794817a705609cfa935f827312a1adfdd26494b6b95dd2b4b3910160405180910390a160cb805463ffffffff909216600160a01b0263ffffffff60a01b19909216919091179055565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60cb546040516001600160a01b038084169216907f237b82f438d75fc568ebab484b75b01d9287b9e98b490b7c23221623b6705dbb90600090a360cb80546001600160a01b0319166001600160a01b0392909216919091179055565b604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b6065546001600160a01b03161580156126e757506001600160a01b03821615155b612704576040516339b190bb60e11b815260040160405180910390fd5b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a261274782611e2b565b5050565b60cb546040805161ffff600160e01b9093048316815291831660208301527f8cdc428b0431b82d1619763f443a48197db344ba96905f3949643acd1c863a06910160405180910390a160cb805461ffff909216600160e01b0261ffff60e01b19909216919091179055565b600061280b826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166129759092919063ffffffff16565b8051909150156122c657808060200190518101906128299190612f72565b6122c65760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610c6a565b6128936020836132d9565b6001901b8463ffffffff16106128bb5760405162c6c39d60e71b815260040160405180910390fd5b60006128c682610b64565b905061291184848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508a92508591505063ffffffff891661298c565b61292e576040516369ca16c960e01b815260040160405180910390fd5b505050505050565b6129416020836132d9565b6001901b8463ffffffff161061296a5760405163054ff4df60e51b815260040160405180910390fd5b60006128c68261184f565b606061298484846000856129a4565b949350505050565b60008361299a868585612ad5565b1495945050505050565b606082471015612a055760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610c6a565b6001600160a01b0385163b612a5c5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610c6a565b600080866001600160a01b03168587604051612a789190613311565b60006040518083038185875af1925050503d8060008114612ab5576040519150601f19603f3d011682016040523d82523d6000602084013e612aba565b606091505b5091509150612aca828286612b72565b979650505050505050565b600060208451612ae59190613323565b15612b03576040516313717da960e21b815260040160405180910390fd5b8260205b85518111612b6957612b1a600285613323565b600003612b3e57816000528086015160205260406000209150600284049350612b57565b8086015160005281602052604060002091506002840493505b612b6260208261313b565b9050612b07565b50949350505050565b60608315612b81575081611769565b825115612b915782518084602001fd5b8160405162461bcd60e51b8152600401610c6a9190613337565b6001600160a01b0381168114610a7657600080fd5b600060208284031215612bd257600080fd5b813561176981612bab565b8015158114610a7657600080fd5b60008060408385031215612bfe57600080fd5b8235612c0981612bab565b91506020830135612c1981612bdd565b809150509250929050565b600060208284031215612c3657600080fd5b5035919050565b600060408284031215612c4f57600080fd5b50919050565b600060408284031215612c6757600080fd5b6117698383612c3d565b60008060408385031215612c8457600080fd5b8235612c8f81612bab565b91506020830135612c1981612bab565b60008060208385031215612cb257600080fd5b823567ffffffffffffffff811115612cc957600080fd5b8301601f81018513612cda57600080fd5b803567ffffffffffffffff811115612cf157600080fd5b8560208260051b8401011115612d0657600080fd5b6020919091019590945092505050565b60006101008284031215612c4f57600080fd5b60008060408385031215612d3c57600080fd5b823567ffffffffffffffff811115612d5357600080fd5b612d5f85828601612d16565b9250506020830135612c1981612bab565b803563ffffffff81168114612d8457600080fd5b919050565b60008060408385031215612d9c57600080fd5b82359150612dac60208401612d70565b90509250929050565b600060208284031215612dc757600080fd5b61176982612d70565b600060208284031215612de257600080fd5b813560ff8116811461176957600080fd5b600060208284031215612e0557600080fd5b813567ffffffffffffffff811115612e1c57600080fd5b61298484828501612d16565b60008060408385031215612e3b57600080fd5b8235612e4681612bab565b946020939093013593505050565b8035612d8481612bab565b803561ffff81168114612d8457600080fd5b60008060008060008060c08789031215612e8a57600080fd5b8635612e9581612bab565b95506020870135612ea581612bab565b9450604087013593506060870135612ebc81612bab565b9250612eca60808801612d70565b9150612ed860a08801612e5f565b90509295509295509295565b600060208284031215612ef657600080fd5b61176982612e5f565b634e487b7160e01b600052601160045260246000fd5b81810381811115610be957610be9612eff565b634e487b7160e01b600052603260045260246000fd5b600081612f4d57612f4d612eff565b506000190190565b600060208284031215612f6757600080fd5b815161176981612bab565b600060208284031215612f8457600080fd5b815161176981612bdd565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b60008235609e19833603018112612fdc57600080fd5b9190910192915050565b81835260208301925060008160005b8481101561304c57813561300881612bab565b6001600160a01b0316865260208201356bffffffffffffffffffffffff811680821461303357600080fd5b6020880152506040958601959190910190600101612ff5565b5093949350505050565b60008135601e1983360301811261306c57600080fd5b820160208101903567ffffffffffffffff81111561308957600080fd5b8060061b360382131561309b57600080fd5b60a085526130ad60a086018284612fe6565b9150506130bc60208401612e54565b6001600160a01b03166020850152604083810135908501526130e060608401612d70565b63ffffffff1660608501526130f760808401612d70565b63ffffffff81166080860152509392505050565b60018060a01b03841681528260208201526060604082015260006131326060830184613056565b95945050505050565b80820180821115610be957610be9612eff565b6020815260006117696020830184613056565b6000808335601e1984360301811261317857600080fd5b83018035915067ffffffffffffffff82111561319357600080fd5b6020019150600581901b36038213156131ab57600080fd5b9250929050565b6000808335601e198436030181126131c957600080fd5b83018035915067ffffffffffffffff8211156131e457600080fd5b6020019150600681901b36038213156131ab57600080fd5b63ffffffff8181168382160190811115610be957610be9612eff565b63ffffffff8281168282160390811115610be957610be9612eff565b600063ffffffff82168061324a5761324a612eff565b6000190192915050565b634e487b7160e01b600052601260045260246000fd5b600063ffffffff83168061328057613280613254565b8063ffffffff84160691505092915050565b6000808335601e198436030181126132a957600080fd5b83018035915067ffffffffffffffff8211156132c457600080fd5b6020019150368190038213156131ab57600080fd5b6000826132e8576132e8613254565b500490565b60005b838110156133085781810151838201526020016132f0565b50506000910152565b60008251612fdc8184602087016132ed565b60008261333257613332613254565b500690565b60208152600082518060208401526133568160408501602087016132ed565b601f01601f1916919091016040019291505056fea26469706673582212203a95cc2ce8ce7de62ba4fd4c2060745edc0ad10c8b0260ded17eae31a6e975ce64736f6c634300081b0033", } // RewardsCoordinatorABI is the input ABI used to generate the binding from. diff --git a/pkg/bindings/RewardsCoordinatorStorage/binding.go b/pkg/bindings/RewardsCoordinatorStorage/binding.go index a5c813df9..fe83adebc 100644 --- a/pkg/bindings/RewardsCoordinatorStorage/binding.go +++ b/pkg/bindings/RewardsCoordinatorStorage/binding.go @@ -77,7 +77,7 @@ type IRewardsCoordinatorTokenTreeMerkleLeaf struct { // RewardsCoordinatorStorageMetaData contains all meta data concerning the RewardsCoordinatorStorage contract. var RewardsCoordinatorStorageMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"function\",\"name\":\"CALCULATION_INTERVAL_SECONDS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"GENESIS_REWARDS_TIMESTAMP\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_FUTURE_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_RETROACTIVE_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_REWARDS_DURATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activationDelay\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateEarnerLeafHash\",\"inputs\":[{\"name\":\"leaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.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\":\"structIRewardsCoordinator.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\":\"structIRewardsCoordinator.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\":\"structIRewardsCoordinator.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\":\"structIRewardsCoordinator.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\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"createAVSRewardsSubmission\",\"inputs\":[{\"name\":\"rewardsSubmissions\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.RewardsSubmission[]\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.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\":\"createRewardsForAllEarners\",\"inputs\":[{\"name\":\"rewardsSubmissions\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.RewardsSubmission[]\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.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\":\"rewardsSubmission\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.RewardsSubmission[]\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.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\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"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\":\"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\":\"structIRewardsCoordinator.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\":\"structIRewardsCoordinator.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\":\"structIRewardsCoordinator.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\":\"getRootIndexFromHash\",\"inputs\":[{\"name\":\"rootHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"globalOperatorCommissionBips\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isAVSRewardsSubmissionHash\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isRewardsForAllSubmitter\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isRewardsSubmissionForAllEarnersHash\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isRewardsSubmissionForAllHash\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"operatorCommissionBips\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"processClaim\",\"inputs\":[{\"name\":\"claim\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.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\":\"structIRewardsCoordinator.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\":\"structIRewardsCoordinator.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\":\"setGlobalOperatorCommission\",\"inputs\":[{\"name\":\"_globalCommissionBips\",\"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\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"submitRoot\",\"inputs\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AVSRewardsSubmissionCreated\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"submissionNonce\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"rewardsSubmissionHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewardsSubmission\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIRewardsCoordinator.RewardsSubmission\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.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\":\"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\":\"GlobalCommissionBipsSet\",\"inputs\":[{\"name\":\"oldGlobalCommissionBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"},{\"name\":\"newGlobalCommissionBips\",\"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\":\"structIRewardsCoordinator.RewardsSubmission\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.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\":\"structIRewardsCoordinator.RewardsSubmission\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.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}]", + 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\":\"structIRewardsCoordinator.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\":\"structIRewardsCoordinator.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\":\"structIRewardsCoordinator.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\":\"structIRewardsCoordinator.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\":\"structIRewardsCoordinator.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\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"createAVSRewardsSubmission\",\"inputs\":[{\"name\":\"rewardsSubmissions\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.RewardsSubmission[]\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.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\":\"createRewardsForAllEarners\",\"inputs\":[{\"name\":\"rewardsSubmissions\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.RewardsSubmission[]\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.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\":\"rewardsSubmission\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.RewardsSubmission[]\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.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\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"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\":\"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\":\"structIRewardsCoordinator.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\":\"structIRewardsCoordinator.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\":\"structIRewardsCoordinator.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\":\"getRootIndexFromHash\",\"inputs\":[{\"name\":\"rootHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"globalOperatorCommissionBips\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isAVSRewardsSubmissionHash\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isRewardsForAllSubmitter\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isRewardsSubmissionForAllEarnersHash\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isRewardsSubmissionForAllHash\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"operatorCommissionBips\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"processClaim\",\"inputs\":[{\"name\":\"claim\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.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\":\"structIRewardsCoordinator.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\":\"structIRewardsCoordinator.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\":\"setGlobalOperatorCommission\",\"inputs\":[{\"name\":\"_globalCommissionBips\",\"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\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"submitRoot\",\"inputs\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AVSRewardsSubmissionCreated\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"submissionNonce\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"rewardsSubmissionHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewardsSubmission\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIRewardsCoordinator.RewardsSubmission\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.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\":\"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\":\"GlobalCommissionBipsSet\",\"inputs\":[{\"name\":\"oldGlobalCommissionBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"},{\"name\":\"newGlobalCommissionBips\",\"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\":\"structIRewardsCoordinator.RewardsSubmission\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.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\":\"structIRewardsCoordinator.RewardsSubmission\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsUpdaterSet\",\"inputs\":[{\"name\":\"oldRewardsUpdater\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newRewardsUpdater\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AmountExceedsMax\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"AmountIsZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"DurationExceedsMax\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"EarningsNotGreaterThanClaimed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputArrayLengthMismatch\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputArrayLengthZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidClaimProof\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDurationRemainder\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidEarnerLeafIndex\",\"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\":\"RewardsEndTimestampNotElapsed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RootAlreadyActivated\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RootDisabled\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RootNotActivated\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StartTimestampTooFarInFuture\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StartTimestampTooFarInPast\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategiesNotInAscendingOrder\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyNotWhitelisted\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UnauthorizedCaller\",\"inputs\":[]}]", } // RewardsCoordinatorStorageABI is the input ABI used to generate the binding from. diff --git a/pkg/bindings/SlashingConstants/binding.go b/pkg/bindings/SlashingConstants/binding.go new file mode 100644 index 000000000..0a9cb4c71 --- /dev/null +++ b/pkg/bindings/SlashingConstants/binding.go @@ -0,0 +1,327 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package SlashingConstants + +import ( + "errors" + "math/big" + "strings" + + ethereum "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/event" +) + +// Reference imports to suppress errors if they are not otherwise used. +var ( + _ = errors.New + _ = big.NewInt + _ = strings.NewReader + _ = ethereum.NotFound + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription + _ = abi.ConvertType +) + +// SlashingConstantsMetaData contains all meta data concerning the SlashingConstants contract. +var SlashingConstantsMetaData = &bind.MetaData{ + ABI: "[{\"type\":\"function\",\"name\":\"DEALLOCATION_DELAY\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"INITIAL_TOTAL_MAGNITUDE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"PRECISION_FACTOR\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"PRECISION_FACTOR_SQUARED\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"}]", + Bin: "0x61010561003a600b82828239805160001a60731461002d57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe730000000000000000000000000000000000000000301460806040526004361060515760003560e01c806321afdf8e1460565780632981eb7714607e5780639a543ca414609b578063ccd34cd51460c1575b600080fd5b606b6ec097ce7bc90715b34b9f100000000081565b6040519081526020015b60405180910390f35b60876217124081565b60405163ffffffff90911681526020016075565b60a9670de0b6b3a764000081565b60405167ffffffffffffffff90911681526020016075565b606b670de0b6b3a76400008156fea264697066735822122051573b877db53ce7fd9202510ed740ac5b29774096c961210de6c69c249f537264736f6c634300080c0033", +} + +// SlashingConstantsABI is the input ABI used to generate the binding from. +// Deprecated: Use SlashingConstantsMetaData.ABI instead. +var SlashingConstantsABI = SlashingConstantsMetaData.ABI + +// SlashingConstantsBin is the compiled bytecode used for deploying new contracts. +// Deprecated: Use SlashingConstantsMetaData.Bin instead. +var SlashingConstantsBin = SlashingConstantsMetaData.Bin + +// DeploySlashingConstants deploys a new Ethereum contract, binding an instance of SlashingConstants to it. +func DeploySlashingConstants(auth *bind.TransactOpts, backend bind.ContractBackend) (common.Address, *types.Transaction, *SlashingConstants, error) { + parsed, err := SlashingConstantsMetaData.GetAbi() + if err != nil { + return common.Address{}, nil, nil, err + } + if parsed == nil { + return common.Address{}, nil, nil, errors.New("GetABI returned nil") + } + + address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(SlashingConstantsBin), backend) + if err != nil { + return common.Address{}, nil, nil, err + } + return address, tx, &SlashingConstants{SlashingConstantsCaller: SlashingConstantsCaller{contract: contract}, SlashingConstantsTransactor: SlashingConstantsTransactor{contract: contract}, SlashingConstantsFilterer: SlashingConstantsFilterer{contract: contract}}, nil +} + +// SlashingConstants is an auto generated Go binding around an Ethereum contract. +type SlashingConstants struct { + SlashingConstantsCaller // Read-only binding to the contract + SlashingConstantsTransactor // Write-only binding to the contract + SlashingConstantsFilterer // Log filterer for contract events +} + +// SlashingConstantsCaller is an auto generated read-only Go binding around an Ethereum contract. +type SlashingConstantsCaller struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// SlashingConstantsTransactor is an auto generated write-only Go binding around an Ethereum contract. +type SlashingConstantsTransactor struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// SlashingConstantsFilterer is an auto generated log filtering Go binding around an Ethereum contract events. +type SlashingConstantsFilterer struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// SlashingConstantsSession is an auto generated Go binding around an Ethereum contract, +// with pre-set call and transact options. +type SlashingConstantsSession struct { + Contract *SlashingConstants // Generic contract binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// SlashingConstantsCallerSession is an auto generated read-only Go binding around an Ethereum contract, +// with pre-set call options. +type SlashingConstantsCallerSession struct { + Contract *SlashingConstantsCaller // Generic contract caller binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session +} + +// SlashingConstantsTransactorSession is an auto generated write-only Go binding around an Ethereum contract, +// with pre-set transact options. +type SlashingConstantsTransactorSession struct { + Contract *SlashingConstantsTransactor // Generic contract transactor binding to set the session for + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// SlashingConstantsRaw is an auto generated low-level Go binding around an Ethereum contract. +type SlashingConstantsRaw struct { + Contract *SlashingConstants // Generic contract binding to access the raw methods on +} + +// SlashingConstantsCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. +type SlashingConstantsCallerRaw struct { + Contract *SlashingConstantsCaller // Generic read-only contract binding to access the raw methods on +} + +// SlashingConstantsTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. +type SlashingConstantsTransactorRaw struct { + Contract *SlashingConstantsTransactor // Generic write-only contract binding to access the raw methods on +} + +// NewSlashingConstants creates a new instance of SlashingConstants, bound to a specific deployed contract. +func NewSlashingConstants(address common.Address, backend bind.ContractBackend) (*SlashingConstants, error) { + contract, err := bindSlashingConstants(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &SlashingConstants{SlashingConstantsCaller: SlashingConstantsCaller{contract: contract}, SlashingConstantsTransactor: SlashingConstantsTransactor{contract: contract}, SlashingConstantsFilterer: SlashingConstantsFilterer{contract: contract}}, nil +} + +// NewSlashingConstantsCaller creates a new read-only instance of SlashingConstants, bound to a specific deployed contract. +func NewSlashingConstantsCaller(address common.Address, caller bind.ContractCaller) (*SlashingConstantsCaller, error) { + contract, err := bindSlashingConstants(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &SlashingConstantsCaller{contract: contract}, nil +} + +// NewSlashingConstantsTransactor creates a new write-only instance of SlashingConstants, bound to a specific deployed contract. +func NewSlashingConstantsTransactor(address common.Address, transactor bind.ContractTransactor) (*SlashingConstantsTransactor, error) { + contract, err := bindSlashingConstants(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &SlashingConstantsTransactor{contract: contract}, nil +} + +// NewSlashingConstantsFilterer creates a new log filterer instance of SlashingConstants, bound to a specific deployed contract. +func NewSlashingConstantsFilterer(address common.Address, filterer bind.ContractFilterer) (*SlashingConstantsFilterer, error) { + contract, err := bindSlashingConstants(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &SlashingConstantsFilterer{contract: contract}, nil +} + +// bindSlashingConstants binds a generic wrapper to an already deployed contract. +func bindSlashingConstants(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := SlashingConstantsMetaData.GetAbi() + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_SlashingConstants *SlashingConstantsRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _SlashingConstants.Contract.SlashingConstantsCaller.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_SlashingConstants *SlashingConstantsRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _SlashingConstants.Contract.SlashingConstantsTransactor.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_SlashingConstants *SlashingConstantsRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _SlashingConstants.Contract.SlashingConstantsTransactor.contract.Transact(opts, method, params...) +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_SlashingConstants *SlashingConstantsCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _SlashingConstants.Contract.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_SlashingConstants *SlashingConstantsTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _SlashingConstants.Contract.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_SlashingConstants *SlashingConstantsTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _SlashingConstants.Contract.contract.Transact(opts, method, params...) +} + +// DEALLOCATIONDELAY is a free data retrieval call binding the contract method 0x2981eb77. +// +// Solidity: function DEALLOCATION_DELAY() view returns(uint32) +func (_SlashingConstants *SlashingConstantsCaller) DEALLOCATIONDELAY(opts *bind.CallOpts) (uint32, error) { + var out []interface{} + err := _SlashingConstants.contract.Call(opts, &out, "DEALLOCATION_DELAY") + + if err != nil { + return *new(uint32), err + } + + out0 := *abi.ConvertType(out[0], new(uint32)).(*uint32) + + return out0, err + +} + +// DEALLOCATIONDELAY is a free data retrieval call binding the contract method 0x2981eb77. +// +// Solidity: function DEALLOCATION_DELAY() view returns(uint32) +func (_SlashingConstants *SlashingConstantsSession) DEALLOCATIONDELAY() (uint32, error) { + return _SlashingConstants.Contract.DEALLOCATIONDELAY(&_SlashingConstants.CallOpts) +} + +// DEALLOCATIONDELAY is a free data retrieval call binding the contract method 0x2981eb77. +// +// Solidity: function DEALLOCATION_DELAY() view returns(uint32) +func (_SlashingConstants *SlashingConstantsCallerSession) DEALLOCATIONDELAY() (uint32, error) { + return _SlashingConstants.Contract.DEALLOCATIONDELAY(&_SlashingConstants.CallOpts) +} + +// INITIALTOTALMAGNITUDE is a free data retrieval call binding the contract method 0x9a543ca4. +// +// Solidity: function INITIAL_TOTAL_MAGNITUDE() view returns(uint64) +func (_SlashingConstants *SlashingConstantsCaller) INITIALTOTALMAGNITUDE(opts *bind.CallOpts) (uint64, error) { + var out []interface{} + err := _SlashingConstants.contract.Call(opts, &out, "INITIAL_TOTAL_MAGNITUDE") + + if err != nil { + return *new(uint64), err + } + + out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64) + + return out0, err + +} + +// INITIALTOTALMAGNITUDE is a free data retrieval call binding the contract method 0x9a543ca4. +// +// Solidity: function INITIAL_TOTAL_MAGNITUDE() view returns(uint64) +func (_SlashingConstants *SlashingConstantsSession) INITIALTOTALMAGNITUDE() (uint64, error) { + return _SlashingConstants.Contract.INITIALTOTALMAGNITUDE(&_SlashingConstants.CallOpts) +} + +// INITIALTOTALMAGNITUDE is a free data retrieval call binding the contract method 0x9a543ca4. +// +// Solidity: function INITIAL_TOTAL_MAGNITUDE() view returns(uint64) +func (_SlashingConstants *SlashingConstantsCallerSession) INITIALTOTALMAGNITUDE() (uint64, error) { + return _SlashingConstants.Contract.INITIALTOTALMAGNITUDE(&_SlashingConstants.CallOpts) +} + +// PRECISIONFACTOR is a free data retrieval call binding the contract method 0xccd34cd5. +// +// Solidity: function PRECISION_FACTOR() view returns(uint256) +func (_SlashingConstants *SlashingConstantsCaller) PRECISIONFACTOR(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _SlashingConstants.contract.Call(opts, &out, "PRECISION_FACTOR") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// PRECISIONFACTOR is a free data retrieval call binding the contract method 0xccd34cd5. +// +// Solidity: function PRECISION_FACTOR() view returns(uint256) +func (_SlashingConstants *SlashingConstantsSession) PRECISIONFACTOR() (*big.Int, error) { + return _SlashingConstants.Contract.PRECISIONFACTOR(&_SlashingConstants.CallOpts) +} + +// PRECISIONFACTOR is a free data retrieval call binding the contract method 0xccd34cd5. +// +// Solidity: function PRECISION_FACTOR() view returns(uint256) +func (_SlashingConstants *SlashingConstantsCallerSession) PRECISIONFACTOR() (*big.Int, error) { + return _SlashingConstants.Contract.PRECISIONFACTOR(&_SlashingConstants.CallOpts) +} + +// PRECISIONFACTORSQUARED is a free data retrieval call binding the contract method 0x21afdf8e. +// +// Solidity: function PRECISION_FACTOR_SQUARED() view returns(uint256) +func (_SlashingConstants *SlashingConstantsCaller) PRECISIONFACTORSQUARED(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _SlashingConstants.contract.Call(opts, &out, "PRECISION_FACTOR_SQUARED") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// PRECISIONFACTORSQUARED is a free data retrieval call binding the contract method 0x21afdf8e. +// +// Solidity: function PRECISION_FACTOR_SQUARED() view returns(uint256) +func (_SlashingConstants *SlashingConstantsSession) PRECISIONFACTORSQUARED() (*big.Int, error) { + return _SlashingConstants.Contract.PRECISIONFACTORSQUARED(&_SlashingConstants.CallOpts) +} + +// PRECISIONFACTORSQUARED is a free data retrieval call binding the contract method 0x21afdf8e. +// +// Solidity: function PRECISION_FACTOR_SQUARED() view returns(uint256) +func (_SlashingConstants *SlashingConstantsCallerSession) PRECISIONFACTORSQUARED() (*big.Int, error) { + return _SlashingConstants.Contract.PRECISIONFACTORSQUARED(&_SlashingConstants.CallOpts) +} diff --git a/pkg/bindings/StrategyBase/binding.go b/pkg/bindings/StrategyBase/binding.go index 02377ad8a..0f3d97d68 100644 --- a/pkg/bindings/StrategyBase/binding.go +++ b/pkg/bindings/StrategyBase/binding.go @@ -31,8 +31,8 @@ var ( // StrategyBaseMetaData contains all meta data concerning the StrategyBase contract. var StrategyBaseMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_strategyManager\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"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\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"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\":\"setPauserRegistry\",\"inputs\":[{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"shares\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"sharesToUnderlying\",\"inputs\":[{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"sharesToUnderlyingView\",\"inputs\":[{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"strategyManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"totalShares\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToShares\",\"inputs\":[{\"name\":\"amountUnderlying\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToSharesView\",\"inputs\":[{\"name\":\"amountUnderlying\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToken\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"userUnderlying\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"userUnderlyingView\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"withdraw\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"ExchangeRateEmitted\",\"inputs\":[{\"name\":\"rate\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PauserRegistrySet\",\"inputs\":[{\"name\":\"pauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"}],\"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}]", - Bin: "0x60a06040523480156200001157600080fd5b5060405162001ab438038062001ab4833981016040819052620000349162000114565b6001600160a01b0381166080526200004b62000052565b5062000146565b600054610100900460ff1615620000bf5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101562000112576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6000602082840312156200012757600080fd5b81516001600160a01b03811681146200013f57600080fd5b9392505050565b60805161193d620001776000396000818161019901528181610570015281816109f50152610ac0015261193d6000f3fe608060405234801561001057600080fd5b50600436106101375760003560e01c80635c975abb116100b8578063ab5921e11161007c578063ab5921e11461029c578063ce7c2ac2146102b1578063d9caed12146102c4578063e3dae51c146102d7578063f3e73875146102ea578063fabc1cbc146102fd57600080fd5b80635c975abb146102425780637a8b26371461024a578063886f11951461025d5780638c871019146102765780638f6a62401461028957600080fd5b806347e7ef24116100ff57806347e7ef24146101d2578063485cc955146101e5578063553ca5f8146101f8578063595c6a671461020b5780635ac86ab71461021357600080fd5b806310d67a2f1461013c578063136439dd146101515780632495a5991461016457806339b70e38146101945780633a98ef39146101bb575b600080fd5b61014f61014a3660046115a6565b610310565b005b61014f61015f3660046115c3565b6103cc565b603254610177906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6101777f000000000000000000000000000000000000000000000000000000000000000081565b6101c460335481565b60405190815260200161018b565b6101c46101e03660046115dc565b610510565b61014f6101f3366004611608565b610754565b6101c46102063660046115a6565b610869565b61014f61087d565b610232610221366004611650565b6001805460ff9092161b9081161490565b604051901515815260200161018b565b6001546101c4565b6101c46102583660046115c3565b610949565b600054610177906201000090046001600160a01b031681565b6101c46102843660046115c3565b610994565b6101c46102973660046115a6565b61099f565b6102a46109ad565b60405161018b919061169d565b6101c46102bf3660046115a6565b6109cd565b61014f6102d23660046116d0565b610a62565b6101c46102e53660046115c3565b610c48565b6101c46102f83660046115c3565b610c81565b61014f61030b3660046115c3565b610c8c565b600060029054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610363573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103879190611711565b6001600160a01b0316336001600160a01b0316146103c05760405162461bcd60e51b81526004016103b79061172e565b60405180910390fd5b6103c981610de8565b50565b60005460405163237dfb4760e11b8152336004820152620100009091046001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610419573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061043d9190611778565b6104595760405162461bcd60e51b81526004016103b79061179a565b600154818116146104d25760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c697479000000000000000060648201526084016103b7565b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b600180546000918291811614156105655760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b60448201526064016103b7565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105dd5760405162461bcd60e51b815260206004820181905260248201527f5374726174656779426173652e6f6e6c7953747261746567794d616e6167657260448201526064016103b7565b6105e78484610eed565b60335460006105f86103e8836117f8565b905060006103e8610607610f6d565b61061191906117f8565b9050600061061f8783611810565b90508061062c8489611827565b6106369190611846565b95508561069c5760405162461bcd60e51b815260206004820152602e60248201527f5374726174656779426173652e6465706f7369743a206e65775368617265732060448201526d63616e6e6f74206265207a65726f60901b60648201526084016103b7565b6106a686856117f8565b60338190556f4b3b4ca85a86c47a098a223fffffffff10156107305760405162461bcd60e51b815260206004820152603c60248201527f5374726174656779426173652e6465706f7369743a20746f74616c536861726560448201527f73206578636565647320604d41585f544f54414c5f534841524553600000000060648201526084016103b7565b610749826103e860335461074491906117f8565b610fdf565b505050505092915050565b600054610100900460ff16158080156107745750600054600160ff909116105b8061078e5750303b15801561078e575060005460ff166001145b6107f15760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016103b7565b6000805460ff191660011790558015610814576000805461ff0019166101001790555b61081e8383611033565b8015610864576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b6000610877610258836109cd565b92915050565b60005460405163237dfb4760e11b8152336004820152620100009091046001600160a01b0316906346fbf68e90602401602060405180830381865afa1580156108ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108ee9190611778565b61090a5760405162461bcd60e51b81526004016103b79061179a565b600019600181905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b6000806103e860335461095c91906117f8565b905060006103e861096b610f6d565b61097591906117f8565b9050816109828583611827565b61098c9190611846565b949350505050565b600061087782610c48565b60006108776102f8836109cd565b60606040518060800160405280604d81526020016118bb604d9139905090565b604051633d3f06c960e11b81526001600160a01b0382811660048301523060248301526000917f000000000000000000000000000000000000000000000000000000000000000090911690637a7e0d9290604401602060405180830381865afa158015610a3e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108779190611868565b6001805460029081161415610ab55760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b60448201526064016103b7565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610b2d5760405162461bcd60e51b815260206004820181905260248201527f5374726174656779426173652e6f6e6c7953747261746567794d616e6167657260448201526064016103b7565b610b3884848461117e565b60335480831115610bc75760405162461bcd60e51b815260206004820152604d60248201527f5374726174656779426173652e77697468647261773a20616d6f756e7453686160448201527f726573206d757374206265206c657373207468616e206f7220657175616c207460648201526c6f20746f74616c53686172657360981b608482015260a4016103b7565b6000610bd56103e8836117f8565b905060006103e8610be4610f6d565b610bee91906117f8565b9050600082610bfd8784611827565b610c079190611846565b9050610c138685611810565b603355610c33610c238284611810565b6103e860335461074491906117f8565b610c3e888883611201565b5050505050505050565b6000806103e8603354610c5b91906117f8565b905060006103e8610c6a610f6d565b610c7491906117f8565b9050806109828386611827565b600061087782610949565b600060029054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610cdf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d039190611711565b6001600160a01b0316336001600160a01b031614610d335760405162461bcd60e51b81526004016103b79061172e565b600154198119600154191614610db15760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c697479000000000000000060648201526084016103b7565b600181905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c90602001610505565b6001600160a01b038116610e765760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a4016103b7565b600054604080516001600160a01b03620100009093048316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1600080546001600160a01b03909216620100000262010000600160b01b0319909216919091179055565b6032546001600160a01b03838116911614610f695760405162461bcd60e51b815260206004820152603660248201527f5374726174656779426173652e6465706f7369743a2043616e206f6e6c79206460448201527532b837b9b4ba103ab73232b9363cb4b733aa37b5b2b760511b60648201526084016103b7565b5050565b6032546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015610fb6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fda9190611868565b905090565b7fd2494f3479e5da49d386657c292c610b5b01df313d07c62eb0cfa49924a31be88161101384670de0b6b3a7640000611827565b61101d9190611846565b6040519081526020015b60405180910390a15050565b600054610100900460ff1661109e5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b60648201526084016103b7565b603280546001600160a01b0319166001600160a01b0384161790556110c4816000611215565b7f1c540707b00eb5427b6b774fc799d756516a54aee108b64b327acc55af557507603260009054906101000a90046001600160a01b0316836001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015611139573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061115d9190611881565b604080516001600160a01b03909316835260ff909116602083015201611027565b6032546001600160a01b038381169116146108645760405162461bcd60e51b815260206004820152603b60248201527f5374726174656779426173652e77697468647261773a2043616e206f6e6c792060448201527f77697468647261772074686520737472617465677920746f6b656e000000000060648201526084016103b7565b6108646001600160a01b0383168483611301565b6000546201000090046001600160a01b031615801561123c57506001600160a01b03821615155b6112be5760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a4016103b7565b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2610f6982610de8565b604080516001600160a01b03848116602483015260448083018590528351808403909101815260649092018352602080830180516001600160e01b031663a9059cbb60e01b17905283518085019094528084527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564908401526108649286929160009161139191851690849061140e565b80519091501561086457808060200190518101906113af9190611778565b6108645760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016103b7565b606061141d8484600085611427565b90505b9392505050565b6060824710156114885760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016103b7565b6001600160a01b0385163b6114df5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016103b7565b600080866001600160a01b031685876040516114fb919061189e565b60006040518083038185875af1925050503d8060008114611538576040519150601f19603f3d011682016040523d82523d6000602084013e61153d565b606091505b509150915061154d828286611558565b979650505050505050565b60608315611567575081611420565b8251156115775782518084602001fd5b8160405162461bcd60e51b81526004016103b7919061169d565b6001600160a01b03811681146103c957600080fd5b6000602082840312156115b857600080fd5b813561142081611591565b6000602082840312156115d557600080fd5b5035919050565b600080604083850312156115ef57600080fd5b82356115fa81611591565b946020939093013593505050565b6000806040838503121561161b57600080fd5b823561162681611591565b9150602083013561163681611591565b809150509250929050565b60ff811681146103c957600080fd5b60006020828403121561166257600080fd5b813561142081611641565b60005b83811015611688578181015183820152602001611670565b83811115611697576000848401525b50505050565b60208152600082518060208401526116bc81604085016020870161166d565b601f01601f19169190910160400192915050565b6000806000606084860312156116e557600080fd5b83356116f081611591565b9250602084013561170081611591565b929592945050506040919091013590565b60006020828403121561172357600080fd5b815161142081611591565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b60006020828403121561178a57600080fd5b8151801515811461142057600080fd5b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b6000821982111561180b5761180b6117e2565b500190565b600082821015611822576118226117e2565b500390565b6000816000190483118215151615611841576118416117e2565b500290565b60008261186357634e487b7160e01b600052601260045260246000fd5b500490565b60006020828403121561187a57600080fd5b5051919050565b60006020828403121561189357600080fd5b815161142081611641565b600082516118b081846020870161166d565b919091019291505056fe4261736520537472617465677920696d706c656d656e746174696f6e20746f20696e68657269742066726f6d20666f72206d6f726520636f6d706c657820696d706c656d656e746174696f6e73a264697066735822122010a959346f6109c589a9783919e1f435adfbf8e6f523baaaa3307a9e4b75ffcb64736f6c634300080c0033", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_strategyManager\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"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\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"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\":\"setPauserRegistry\",\"inputs\":[{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"shares\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"sharesToUnderlying\",\"inputs\":[{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"sharesToUnderlyingView\",\"inputs\":[{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"strategyManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"totalShares\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToShares\",\"inputs\":[{\"name\":\"amountUnderlying\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToSharesView\",\"inputs\":[{\"name\":\"amountUnderlying\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToken\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"userUnderlying\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"userUnderlyingView\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"withdraw\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"ExchangeRateEmitted\",\"inputs\":[{\"name\":\"rate\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PauserRegistrySet\",\"inputs\":[{\"name\":\"pauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyTokenSet\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIERC20\"},{\"name\":\"decimals\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"BalanceExceedsMaxTotalDeposits\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CurrentlyPaused\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNewPausedStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxPerDepositExceedsMax\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NewSharesZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyPauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnderlyingToken\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnpauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"TotalSharesExceedsMax\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UnauthorizedCaller\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"WithdrawalAmountExceedsTotalDeposits\",\"inputs\":[]}]", + Bin: "0x60a060405234801561001057600080fd5b5060405161162638038061162683398101604081905261002f9161010a565b6001600160a01b03811660805261004461004a565b5061013a565b600054610100900460ff16156100b65760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff9081161015610108576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b60006020828403121561011c57600080fd5b81516001600160a01b038116811461013357600080fd5b9392505050565b6080516114bc61016a60003960008181610199015281816104e8015281816108ac015261094b01526114bc6000f3fe608060405234801561001057600080fd5b50600436106101375760003560e01c80635c975abb116100b8578063ab5921e11161007c578063ab5921e11461029c578063ce7c2ac2146102b1578063d9caed12146102c4578063e3dae51c146102d7578063f3e73875146102ea578063fabc1cbc146102fd57600080fd5b80635c975abb146102425780637a8b26371461024a578063886f11951461025d5780638c871019146102765780638f6a62401461028957600080fd5b806347e7ef24116100ff57806347e7ef24146101d2578063485cc955146101e5578063553ca5f8146101f8578063595c6a671461020b5780635ac86ab71461021357600080fd5b806310d67a2f1461013c578063136439dd146101515780632495a5991461016457806339b70e38146101945780633a98ef39146101bb575b600080fd5b61014f61014a3660046111d4565b610310565b005b61014f61015f3660046111f1565b6103c4565b603254610177906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6101777f000000000000000000000000000000000000000000000000000000000000000081565b6101c460335481565b60405190815260200161018b565b6101c46101e036600461120a565b6104b4565b61014f6101f3366004611236565b610605565b6101c46102063660046111d4565b61071f565b61014f610733565b61023261022136600461127e565b6001805460ff9092161b9081161490565b604051901515815260200161018b565b6001546101c4565b6101c46102583660046111f1565b610800565b600054610177906201000090046001600160a01b031681565b6101c46102843660046111f1565b61084b565b6101c46102973660046111d4565b610856565b6102a4610864565b60405161018b91906112bf565b6101c46102bf3660046111d4565b610884565b61014f6102d23660046112f2565b610919565b6101c46102e53660046111f1565b610a39565b6101c46102f83660046111f1565b610a72565b61014f61030b3660046111f1565b610a7d565b600060029054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610363573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103879190611333565b6001600160a01b0316336001600160a01b0316146103b85760405163794821ff60e01b815260040160405180910390fd5b6103c181610b85565b50565b60005460405163237dfb4760e11b8152336004820152620100009091046001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610411573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104359190611350565b61045257604051631d77d47760e21b815260040160405180910390fd5b600154818116146104765760405163c61dca5d60e01b815260040160405180910390fd5b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b6001805460009182918116036104dd5760405163840a48d560e01b815260040160405180910390fd5b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461052657604051635c427cd960e01b815260040160405180910390fd5b6105308484610c23565b60335460006105416103e883611388565b905060006103e8610550610c55565b61055a9190611388565b90506000610568878361139b565b90508061057584896113ae565b61057f91906113c5565b9550856000036105a257604051630c392ed360e11b815260040160405180910390fd5b6105ac8685611388565b60338190556f4b3b4ca85a86c47a098a223fffffffff10156105e157604051632f14e8a360e11b815260040160405180910390fd5b6105fa826103e86033546105f59190611388565b610cc7565b505050505092915050565b600054610100900460ff16158080156106255750600054600160ff909116105b8061063f5750303b15801561063f575060005460ff166001145b6106a75760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff1916600117905580156106ca576000805461ff0019166101001790555b6106d48383610d1b565b801561071a576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b600061072d61025883610884565b92915050565b60005460405163237dfb4760e11b8152336004820152620100009091046001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610780573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107a49190611350565b6107c157604051631d77d47760e21b815260040160405180910390fd5b600019600181905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b6000806103e86033546108139190611388565b905060006103e8610822610c55565b61082c9190611388565b90508161083985836113ae565b61084391906113c5565b949350505050565b600061072d82610a39565b600061072d6102f883610884565b60606040518060800160405280604d815260200161143a604d9139905090565b604051633d3f06c960e11b81526001600160a01b0382811660048301523060248301526000917f000000000000000000000000000000000000000000000000000000000000000090911690637a7e0d9290604401602060405180830381865afa1580156108f5573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061072d91906113e7565b600180546002908116036109405760405163840a48d560e01b815260040160405180910390fd5b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461098957604051635c427cd960e01b815260040160405180910390fd5b610994848484610e66565b603354808311156109b857604051630b469df360e41b815260040160405180910390fd5b60006109c66103e883611388565b905060006103e86109d5610c55565b6109df9190611388565b90506000826109ee87846113ae565b6109f891906113c5565b9050610a04868561139b565b603355610a24610a14828461139b565b6103e86033546105f59190611388565b610a2f888883610e94565b5050505050505050565b6000806103e8603354610a4c9190611388565b905060006103e8610a5b610c55565b610a659190611388565b90508061083983866113ae565b600061072d82610800565b600060029054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ad0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610af49190611333565b6001600160a01b0316336001600160a01b031614610b255760405163794821ff60e01b815260040160405180910390fd5b600154198119600154191614610b4e5760405163c61dca5d60e01b815260040160405180910390fd5b600181905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c906020016104a9565b6001600160a01b038116610bac576040516339b190bb60e11b815260040160405180910390fd5b600054604080516001600160a01b03620100009093048316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1600080546001600160a01b03909216620100000262010000600160b01b0319909216919091179055565b6032546001600160a01b03838116911614610c5157604051630312abdd60e61b815260040160405180910390fd5b5050565b6032546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015610c9e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cc291906113e7565b905090565b7fd2494f3479e5da49d386657c292c610b5b01df313d07c62eb0cfa49924a31be881610cfb84670de0b6b3a76400006113ae565b610d0591906113c5565b6040519081526020015b60405180910390a15050565b600054610100900460ff16610d865760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840161069e565b603280546001600160a01b0319166001600160a01b038416179055610dac816000610ea8565b7f1c540707b00eb5427b6b774fc799d756516a54aee108b64b327acc55af557507603260009054906101000a90046001600160a01b0316836001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e21573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e459190611400565b604080516001600160a01b03909316835260ff909116602083015201610d0f565b6032546001600160a01b0383811691161461071a57604051630312abdd60e61b815260040160405180910390fd5b61071a6001600160a01b0383168483610f2f565b6000546201000090046001600160a01b0316158015610ecf57506001600160a01b03821615155b610eec576040516339b190bb60e11b815260040160405180910390fd5b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2610c5182610b85565b604080516001600160a01b03848116602483015260448083018590528351808403909101815260649092018352602080830180516001600160e01b031663a9059cbb60e01b17905283518085019094528084527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65649084015261071a92869291600091610fbf91851690849061103c565b80519091501561071a5780806020019051810190610fdd9190611350565b61071a5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840161069e565b606061104b8484600085611055565b90505b9392505050565b6060824710156110b65760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840161069e565b6001600160a01b0385163b61110d5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161069e565b600080866001600160a01b03168587604051611129919061141d565b60006040518083038185875af1925050503d8060008114611166576040519150601f19603f3d011682016040523d82523d6000602084013e61116b565b606091505b509150915061117b828286611186565b979650505050505050565b6060831561119557508161104e565b8251156111a55782518084602001fd5b8160405162461bcd60e51b815260040161069e91906112bf565b6001600160a01b03811681146103c157600080fd5b6000602082840312156111e657600080fd5b813561104e816111bf565b60006020828403121561120357600080fd5b5035919050565b6000806040838503121561121d57600080fd5b8235611228816111bf565b946020939093013593505050565b6000806040838503121561124957600080fd5b8235611254816111bf565b91506020830135611264816111bf565b809150509250929050565b60ff811681146103c157600080fd5b60006020828403121561129057600080fd5b813561104e8161126f565b60005b838110156112b657818101518382015260200161129e565b50506000910152565b60208152600082518060208401526112de81604085016020870161129b565b601f01601f19169190910160400192915050565b60008060006060848603121561130757600080fd5b8335611312816111bf565b92506020840135611322816111bf565b929592945050506040919091013590565b60006020828403121561134557600080fd5b815161104e816111bf565b60006020828403121561136257600080fd5b8151801515811461104e57600080fd5b634e487b7160e01b600052601160045260246000fd5b8082018082111561072d5761072d611372565b8181038181111561072d5761072d611372565b808202811582820484141761072d5761072d611372565b6000826113e257634e487b7160e01b600052601260045260246000fd5b500490565b6000602082840312156113f957600080fd5b5051919050565b60006020828403121561141257600080fd5b815161104e8161126f565b6000825161142f81846020870161129b565b919091019291505056fe4261736520537472617465677920696d706c656d656e746174696f6e20746f20696e68657269742066726f6d20666f72206d6f726520636f6d706c657820696d706c656d656e746174696f6e73a2646970667358221220db7dc501fe6d8a6582c38621f259963aefb0ee45e95afc1bb65ecf1e201cd79064736f6c634300081b0033", } // StrategyBaseABI is the input ABI used to generate the binding from. diff --git a/pkg/bindings/StrategyBaseTVLLimits/binding.go b/pkg/bindings/StrategyBaseTVLLimits/binding.go index c0b5f85d3..322dd3f07 100644 --- a/pkg/bindings/StrategyBaseTVLLimits/binding.go +++ b/pkg/bindings/StrategyBaseTVLLimits/binding.go @@ -31,8 +31,8 @@ var ( // StrategyBaseTVLLimitsMetaData contains all meta data concerning the StrategyBaseTVLLimits contract. var StrategyBaseTVLLimitsMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_strategyManager\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"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\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_underlyingToken\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"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\":\"setPauserRegistry\",\"inputs\":[{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setTVLLimits\",\"inputs\":[{\"name\":\"newMaxPerDeposit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"newMaxTotalDeposits\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"shares\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"sharesToUnderlying\",\"inputs\":[{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"sharesToUnderlyingView\",\"inputs\":[{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"strategyManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"totalShares\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToShares\",\"inputs\":[{\"name\":\"amountUnderlying\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToSharesView\",\"inputs\":[{\"name\":\"amountUnderlying\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToken\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"userUnderlying\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"userUnderlyingView\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"withdraw\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"ExchangeRateEmitted\",\"inputs\":[{\"name\":\"rate\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"MaxPerDepositUpdated\",\"inputs\":[{\"name\":\"previousValue\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"newValue\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"MaxTotalDepositsUpdated\",\"inputs\":[{\"name\":\"previousValue\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"newValue\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PauserRegistrySet\",\"inputs\":[{\"name\":\"pauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"}],\"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}]", - Bin: "0x60a06040523480156200001157600080fd5b5060405162001f4d38038062001f4d833981016040819052620000349162000116565b6001600160a01b038116608052806200004c62000054565b505062000148565b600054610100900460ff1615620000c15760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101562000114576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6000602082840312156200012957600080fd5b81516001600160a01b03811681146200014157600080fd5b9392505050565b608051611dd46200017960003960008181610216015281816107a901528181610be70152610cb20152611dd46000f3fe608060405234801561001057600080fd5b506004361061018e5760003560e01c80635c975abb116100de578063ab5921e111610097578063df6fadc111610071578063df6fadc114610366578063e3dae51c14610381578063f3e7387514610394578063fabc1cbc146103a757600080fd5b8063ab5921e11461032b578063ce7c2ac214610340578063d9caed121461035357600080fd5b80635c975abb146102c857806361b01b5d146102d05780637a8b2637146102d9578063886f1195146102ec5780638c871019146103055780638f6a62401461031857600080fd5b80633a98ef391161014b578063485cc95511610125578063485cc9551461026b578063553ca5f81461027e578063595c6a67146102915780635ac86ab71461029957600080fd5b80633a98ef391461023857806343fe08b01461024f57806347e7ef241461025857600080fd5b8063019e27291461019357806310d67a2f146101a857806311c70c9d146101bb578063136439dd146101ce5780632495a599146101e157806339b70e3814610211575b600080fd5b6101a66101a1366004611983565b6103ba565b005b6101a66101b63660046119cd565b61049d565b6101a66101c93660046119ea565b610550565b6101a66101dc366004611a0c565b610605565b6032546101f4906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6101f47f000000000000000000000000000000000000000000000000000000000000000081565b61024160335481565b604051908152602001610208565b61024160645481565b610241610266366004611a25565b610749565b6101a6610279366004611a51565b61098d565b61024161028c3660046119cd565b610a5b565b6101a6610a6f565b6102b86102a7366004611a99565b6001805460ff9092161b9081161490565b6040519015158152602001610208565b600154610241565b61024160655481565b6102416102e7366004611a0c565b610b3b565b6000546101f4906201000090046001600160a01b031681565b610241610313366004611a0c565b610b86565b6102416103263660046119cd565b610b91565b610333610b9f565b6040516102089190611ae6565b61024161034e3660046119cd565b610bbf565b6101a6610361366004611b19565b610c54565b60645460655460408051928352602083019190915201610208565b61024161038f366004611a0c565b610e3a565b6102416103a2366004611a0c565b610e73565b6101a66103b5366004611a0c565b610e7e565b600054610100900460ff16158080156103da5750600054600160ff909116105b806103f45750303b1580156103f4575060005460ff166001145b6104195760405162461bcd60e51b815260040161041090611b5a565b60405180910390fd5b6000805460ff19166001179055801561043c576000805461ff0019166101001790555b6104468585610fda565b61045083836110e7565b8015610496576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050565b600060029054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104f0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105149190611ba8565b6001600160a01b0316336001600160a01b0316146105445760405162461bcd60e51b815260040161041090611bc5565b61054d8161123a565b50565b600060029054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156105a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105c79190611ba8565b6001600160a01b0316336001600160a01b0316146105f75760405162461bcd60e51b815260040161041090611bc5565b6106018282610fda565b5050565b60005460405163237dfb4760e11b8152336004820152620100009091046001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610652573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106769190611c0f565b6106925760405162461bcd60e51b815260040161041090611c31565b6001548181161461070b5760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c69747900000000000000006064820152608401610410565b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b6001805460009182918116141561079e5760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b6044820152606401610410565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146108165760405162461bcd60e51b815260206004820181905260248201527f5374726174656779426173652e6f6e6c7953747261746567794d616e616765726044820152606401610410565b610820848461133f565b60335460006108316103e883611c8f565b905060006103e8610840611421565b61084a9190611c8f565b905060006108588783611ca7565b9050806108658489611cbe565b61086f9190611cdd565b9550856108d55760405162461bcd60e51b815260206004820152602e60248201527f5374726174656779426173652e6465706f7369743a206e65775368617265732060448201526d63616e6e6f74206265207a65726f60901b6064820152608401610410565b6108df8685611c8f565b60338190556f4b3b4ca85a86c47a098a223fffffffff10156109695760405162461bcd60e51b815260206004820152603c60248201527f5374726174656779426173652e6465706f7369743a20746f74616c536861726560448201527f73206578636565647320604d41585f544f54414c5f53484152455360000000006064820152608401610410565b610982826103e860335461097d9190611c8f565b611493565b505050505092915050565b600054610100900460ff16158080156109ad5750600054600160ff909116105b806109c75750303b1580156109c7575060005460ff166001145b6109e35760405162461bcd60e51b815260040161041090611b5a565b6000805460ff191660011790558015610a06576000805461ff0019166101001790555b610a1083836110e7565b8015610a56576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b6000610a696102e783610bbf565b92915050565b60005460405163237dfb4760e11b8152336004820152620100009091046001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610abc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ae09190611c0f565b610afc5760405162461bcd60e51b815260040161041090611c31565b600019600181905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b6000806103e8603354610b4e9190611c8f565b905060006103e8610b5d611421565b610b679190611c8f565b905081610b748583611cbe565b610b7e9190611cdd565b949350505050565b6000610a6982610e3a565b6000610a696103a283610bbf565b60606040518060800160405280604d8152602001611d52604d9139905090565b604051633d3f06c960e11b81526001600160a01b0382811660048301523060248301526000917f000000000000000000000000000000000000000000000000000000000000000090911690637a7e0d9290604401602060405180830381865afa158015610c30573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a699190611cff565b6001805460029081161415610ca75760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b6044820152606401610410565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610d1f5760405162461bcd60e51b815260206004820181905260248201527f5374726174656779426173652e6f6e6c7953747261746567794d616e616765726044820152606401610410565b610d2a8484846114df565b60335480831115610db95760405162461bcd60e51b815260206004820152604d60248201527f5374726174656779426173652e77697468647261773a20616d6f756e7453686160448201527f726573206d757374206265206c657373207468616e206f7220657175616c207460648201526c6f20746f74616c53686172657360981b608482015260a401610410565b6000610dc76103e883611c8f565b905060006103e8610dd6611421565b610de09190611c8f565b9050600082610def8784611cbe565b610df99190611cdd565b9050610e058685611ca7565b603355610e25610e158284611ca7565b6103e860335461097d9190611c8f565b610e30888883611562565b5050505050505050565b6000806103e8603354610e4d9190611c8f565b905060006103e8610e5c611421565b610e669190611c8f565b905080610b748386611cbe565b6000610a6982610b3b565b600060029054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ed1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ef59190611ba8565b6001600160a01b0316336001600160a01b031614610f255760405162461bcd60e51b815260040161041090611bc5565b600154198119600154191614610fa35760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c69747900000000000000006064820152608401610410565b600181905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200161073e565b60645460408051918252602082018490527ff97ed4e083acac67830025ecbc756d8fe847cdbdca4cee3fe1e128e98b54ecb5910160405180910390a160655460408051918252602082018390527f6ab181e0440bfbf4bacdf2e99674735ce6638005490688c5f994f5399353e452910160405180910390a1808211156110dc5760405162461bcd60e51b815260206004820152604b60248201527f53747261746567794261736554564c4c696d6974732e5f73657454564c4c696d60448201527f6974733a206d61785065724465706f7369742065786365656473206d6178546f60648201526a74616c4465706f7369747360a81b608482015260a401610410565b606491909155606555565b600054610100900460ff166111525760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401610410565b603280546001600160a01b0319166001600160a01b038416179055611178816000611576565b7f1c540707b00eb5427b6b774fc799d756516a54aee108b64b327acc55af557507603260009054906101000a90046001600160a01b0316836001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111ed573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112119190611d18565b604080516001600160a01b03909316835260ff9091166020830152015b60405180910390a15050565b6001600160a01b0381166112c85760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a401610410565b600054604080516001600160a01b03620100009093048316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1600080546001600160a01b03909216620100000262010000600160b01b0319909216919091179055565b6064548111156113a95760405162461bcd60e51b815260206004820152602f60248201527f53747261746567794261736554564c4c696d6974733a206d617820706572206460448201526e195c1bdcda5d08195e18d959591959608a1b6064820152608401610410565b6065546113b4611421565b11156114175760405162461bcd60e51b815260206004820152602c60248201527f53747261746567794261736554564c4c696d6974733a206d6178206465706f7360448201526b1a5d1cc8195e18d95959195960a21b6064820152608401610410565b6106018282611662565b6032546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa15801561146a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061148e9190611cff565b905090565b7fd2494f3479e5da49d386657c292c610b5b01df313d07c62eb0cfa49924a31be8816114c784670de0b6b3a7640000611cbe565b6114d19190611cdd565b60405190815260200161122e565b6032546001600160a01b03838116911614610a565760405162461bcd60e51b815260206004820152603b60248201527f5374726174656779426173652e77697468647261773a2043616e206f6e6c792060448201527f77697468647261772074686520737472617465677920746f6b656e00000000006064820152608401610410565b610a566001600160a01b03831684836116de565b6000546201000090046001600160a01b031615801561159d57506001600160a01b03821615155b61161f5760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a401610410565b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a26106018261123a565b6032546001600160a01b038381169116146106015760405162461bcd60e51b815260206004820152603660248201527f5374726174656779426173652e6465706f7369743a2043616e206f6e6c79206460448201527532b837b9b4ba103ab73232b9363cb4b733aa37b5b2b760511b6064820152608401610410565b604080516001600160a01b03848116602483015260448083018590528351808403909101815260649092018352602080830180516001600160e01b031663a9059cbb60e01b17905283518085019094528084527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c656490840152610a569286929160009161176e9185169084906117eb565b805190915015610a56578080602001905181019061178c9190611c0f565b610a565760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610410565b60606117fa8484600085611804565b90505b9392505050565b6060824710156118655760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610410565b6001600160a01b0385163b6118bc5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610410565b600080866001600160a01b031685876040516118d89190611d35565b60006040518083038185875af1925050503d8060008114611915576040519150601f19603f3d011682016040523d82523d6000602084013e61191a565b606091505b509150915061192a828286611935565b979650505050505050565b606083156119445750816117fd565b8251156119545782518084602001fd5b8160405162461bcd60e51b81526004016104109190611ae6565b6001600160a01b038116811461054d57600080fd5b6000806000806080858703121561199957600080fd5b843593506020850135925060408501356119b28161196e565b915060608501356119c28161196e565b939692955090935050565b6000602082840312156119df57600080fd5b81356117fd8161196e565b600080604083850312156119fd57600080fd5b50508035926020909101359150565b600060208284031215611a1e57600080fd5b5035919050565b60008060408385031215611a3857600080fd5b8235611a438161196e565b946020939093013593505050565b60008060408385031215611a6457600080fd5b8235611a6f8161196e565b91506020830135611a7f8161196e565b809150509250929050565b60ff8116811461054d57600080fd5b600060208284031215611aab57600080fd5b81356117fd81611a8a565b60005b83811015611ad1578181015183820152602001611ab9565b83811115611ae0576000848401525b50505050565b6020815260008251806020840152611b05816040850160208701611ab6565b601f01601f19169190910160400192915050565b600080600060608486031215611b2e57600080fd5b8335611b398161196e565b92506020840135611b498161196e565b929592945050506040919091013590565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b600060208284031215611bba57600080fd5b81516117fd8161196e565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b600060208284031215611c2157600080fd5b815180151581146117fd57600080fd5b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b60008219821115611ca257611ca2611c79565b500190565b600082821015611cb957611cb9611c79565b500390565b6000816000190483118215151615611cd857611cd8611c79565b500290565b600082611cfa57634e487b7160e01b600052601260045260246000fd5b500490565b600060208284031215611d1157600080fd5b5051919050565b600060208284031215611d2a57600080fd5b81516117fd81611a8a565b60008251611d47818460208701611ab6565b919091019291505056fe4261736520537472617465677920696d706c656d656e746174696f6e20746f20696e68657269742066726f6d20666f72206d6f726520636f6d706c657820696d706c656d656e746174696f6e73a26469706673582212208549fd2100ff79e56d7fded410ac662be502dbe16e18a815844148c99c0b5bc864736f6c634300080c0033", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_strategyManager\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"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\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_underlyingToken\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"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\":\"setPauserRegistry\",\"inputs\":[{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setTVLLimits\",\"inputs\":[{\"name\":\"newMaxPerDeposit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"newMaxTotalDeposits\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"shares\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"sharesToUnderlying\",\"inputs\":[{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"sharesToUnderlyingView\",\"inputs\":[{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"strategyManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"totalShares\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToShares\",\"inputs\":[{\"name\":\"amountUnderlying\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToSharesView\",\"inputs\":[{\"name\":\"amountUnderlying\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToken\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"userUnderlying\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"userUnderlyingView\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"withdraw\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"ExchangeRateEmitted\",\"inputs\":[{\"name\":\"rate\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"MaxPerDepositUpdated\",\"inputs\":[{\"name\":\"previousValue\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"newValue\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"MaxTotalDepositsUpdated\",\"inputs\":[{\"name\":\"previousValue\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"newValue\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PauserRegistrySet\",\"inputs\":[{\"name\":\"pauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyTokenSet\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIERC20\"},{\"name\":\"decimals\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"BalanceExceedsMaxTotalDeposits\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CurrentlyPaused\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNewPausedStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxPerDepositExceedsMax\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NewSharesZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyPauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnderlyingToken\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnpauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"TotalSharesExceedsMax\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UnauthorizedCaller\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"WithdrawalAmountExceedsTotalDeposits\",\"inputs\":[]}]", + Bin: "0x60a060405234801561001057600080fd5b506040516119d03803806119d083398101604081905261002f9161010c565b6001600160a01b0381166080528061004561004c565b505061013c565b600054610100900460ff16156100b85760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101561010a576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b60006020828403121561011e57600080fd5b81516001600160a01b038116811461013557600080fd5b9392505050565b60805161186461016c600039600081816102160152818161072b01528181610aa30152610b4201526118646000f3fe608060405234801561001057600080fd5b506004361061018e5760003560e01c80635c975abb116100de578063ab5921e111610097578063df6fadc111610071578063df6fadc114610366578063e3dae51c14610381578063f3e7387514610394578063fabc1cbc146103a757600080fd5b8063ab5921e11461032b578063ce7c2ac214610340578063d9caed121461035357600080fd5b80635c975abb146102c857806361b01b5d146102d05780637a8b2637146102d9578063886f1195146102ec5780638c871019146103055780638f6a62401461031857600080fd5b80633a98ef391161014b578063485cc95511610125578063485cc9551461026b578063553ca5f81461027e578063595c6a67146102915780635ac86ab71461029957600080fd5b80633a98ef391461023857806343fe08b01461024f57806347e7ef241461025857600080fd5b8063019e27291461019357806310d67a2f146101a857806311c70c9d146101bb578063136439dd146101ce5780632495a599146101e157806339b70e3814610211575b600080fd5b6101a66101a13660046114c2565b6103ba565b005b6101a66101b636600461150c565b61049d565b6101a66101c9366004611529565b610551565b6101a66101dc36600461154b565b610607565b6032546101f4906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6101f47f000000000000000000000000000000000000000000000000000000000000000081565b61024160335481565b604051908152602001610208565b61024160645481565b610241610266366004611564565b6106f7565b6101a6610279366004611590565b610848565b61024161028c36600461150c565b610916565b6101a661092a565b6102b86102a73660046115d8565b6001805460ff9092161b9081161490565b6040519015158152602001610208565b600154610241565b61024160655481565b6102416102e736600461154b565b6109f7565b6000546101f4906201000090046001600160a01b031681565b61024161031336600461154b565b610a42565b61024161032636600461150c565b610a4d565b610333610a5b565b6040516102089190611619565b61024161034e36600461150c565b610a7b565b6101a661036136600461164c565b610b10565b60645460655460408051928352602083019190915201610208565b61024161038f36600461154b565b610c30565b6102416103a236600461154b565b610c69565b6101a66103b536600461154b565b610c74565b600054610100900460ff16158080156103da5750600054600160ff909116105b806103f45750303b1580156103f4575060005460ff166001145b6104195760405162461bcd60e51b81526004016104109061168d565b60405180910390fd5b6000805460ff19166001179055801561043c576000805461ff0019166101001790555b6104468585610d7c565b6104508383610e20565b8015610496576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050565b600060029054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104f0573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061051491906116db565b6001600160a01b0316336001600160a01b0316146105455760405163794821ff60e01b815260040160405180910390fd5b61054e81610f73565b50565b600060029054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156105a4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105c891906116db565b6001600160a01b0316336001600160a01b0316146105f95760405163794821ff60e01b815260040160405180910390fd5b6106038282610d7c565b5050565b60005460405163237dfb4760e11b8152336004820152620100009091046001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610654573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061067891906116f8565b61069557604051631d77d47760e21b815260040160405180910390fd5b600154818116146106b95760405163c61dca5d60e01b815260040160405180910390fd5b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b6001805460009182918116036107205760405163840a48d560e01b815260040160405180910390fd5b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461076957604051635c427cd960e01b815260040160405180910390fd5b6107738484611011565b60335460006107846103e883611730565b905060006103e8610793611068565b61079d9190611730565b905060006107ab8783611743565b9050806107b88489611756565b6107c2919061176d565b9550856000036107e557604051630c392ed360e11b815260040160405180910390fd5b6107ef8685611730565b60338190556f4b3b4ca85a86c47a098a223fffffffff101561082457604051632f14e8a360e11b815260040160405180910390fd5b61083d826103e86033546108389190611730565b6110da565b505050505092915050565b600054610100900460ff16158080156108685750600054600160ff909116105b806108825750303b158015610882575060005460ff166001145b61089e5760405162461bcd60e51b81526004016104109061168d565b6000805460ff1916600117905580156108c1576000805461ff0019166101001790555b6108cb8383610e20565b8015610911576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b60006109246102e783610a7b565b92915050565b60005460405163237dfb4760e11b8152336004820152620100009091046001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610977573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061099b91906116f8565b6109b857604051631d77d47760e21b815260040160405180910390fd5b600019600181905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b6000806103e8603354610a0a9190611730565b905060006103e8610a19611068565b610a239190611730565b905081610a308583611756565b610a3a919061176d565b949350505050565b600061092482610c30565b60006109246103a283610a7b565b60606040518060800160405280604d81526020016117e2604d9139905090565b604051633d3f06c960e11b81526001600160a01b0382811660048301523060248301526000917f000000000000000000000000000000000000000000000000000000000000000090911690637a7e0d9290604401602060405180830381865afa158015610aec573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610924919061178f565b60018054600290811603610b375760405163840a48d560e01b815260040160405180910390fd5b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610b8057604051635c427cd960e01b815260040160405180910390fd5b610b8b848484611126565b60335480831115610baf57604051630b469df360e41b815260040160405180910390fd5b6000610bbd6103e883611730565b905060006103e8610bcc611068565b610bd69190611730565b9050600082610be58784611756565b610bef919061176d565b9050610bfb8685611743565b603355610c1b610c0b8284611743565b6103e86033546108389190611730565b610c26888883611154565b5050505050505050565b6000806103e8603354610c439190611730565b905060006103e8610c52611068565b610c5c9190611730565b905080610a308386611756565b6000610924826109f7565b600060029054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610cc7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ceb91906116db565b6001600160a01b0316336001600160a01b031614610d1c5760405163794821ff60e01b815260040160405180910390fd5b600154198119600154191614610d455760405163c61dca5d60e01b815260040160405180910390fd5b600181905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c906020016106ec565b60645460408051918252602082018490527ff97ed4e083acac67830025ecbc756d8fe847cdbdca4cee3fe1e128e98b54ecb5910160405180910390a160655460408051918252602082018390527f6ab181e0440bfbf4bacdf2e99674735ce6638005490688c5f994f5399353e452910160405180910390a180821115610e155760405163052b07b760e21b815260040160405180910390fd5b606491909155606555565b600054610100900460ff16610e8b5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401610410565b603280546001600160a01b0319166001600160a01b038416179055610eb1816000611168565b7f1c540707b00eb5427b6b774fc799d756516a54aee108b64b327acc55af557507603260009054906101000a90046001600160a01b0316836001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f26573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f4a91906117a8565b604080516001600160a01b03909316835260ff9091166020830152015b60405180910390a15050565b6001600160a01b038116610f9a576040516339b190bb60e11b815260040160405180910390fd5b600054604080516001600160a01b03620100009093048316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1600080546001600160a01b03909216620100000262010000600160b01b0319909216919091179055565b6064548111156110345760405163052b07b760e21b815260040160405180910390fd5b60655461103f611068565b111561105e5760405163d86bae6760e01b815260040160405180910390fd5b61060382826111ef565b6032546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa1580156110b1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110d5919061178f565b905090565b7fd2494f3479e5da49d386657c292c610b5b01df313d07c62eb0cfa49924a31be88161110e84670de0b6b3a7640000611756565b611118919061176d565b604051908152602001610f67565b6032546001600160a01b0383811691161461091157604051630312abdd60e61b815260040160405180910390fd5b6109116001600160a01b038316848361121d565b6000546201000090046001600160a01b031615801561118f57506001600160a01b03821615155b6111ac576040516339b190bb60e11b815260040160405180910390fd5b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a261060382610f73565b6032546001600160a01b0383811691161461060357604051630312abdd60e61b815260040160405180910390fd5b604080516001600160a01b03848116602483015260448083018590528351808403909101815260649092018352602080830180516001600160e01b031663a9059cbb60e01b17905283518085019094528084527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c656490840152610911928692916000916112ad91851690849061132a565b80519091501561091157808060200190518101906112cb91906116f8565b6109115760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610410565b60606113398484600085611343565b90505b9392505050565b6060824710156113a45760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610410565b6001600160a01b0385163b6113fb5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610410565b600080866001600160a01b0316858760405161141791906117c5565b60006040518083038185875af1925050503d8060008114611454576040519150601f19603f3d011682016040523d82523d6000602084013e611459565b606091505b5091509150611469828286611474565b979650505050505050565b6060831561148357508161133c565b8251156114935782518084602001fd5b8160405162461bcd60e51b81526004016104109190611619565b6001600160a01b038116811461054e57600080fd5b600080600080608085870312156114d857600080fd5b843593506020850135925060408501356114f1816114ad565b91506060850135611501816114ad565b939692955090935050565b60006020828403121561151e57600080fd5b813561133c816114ad565b6000806040838503121561153c57600080fd5b50508035926020909101359150565b60006020828403121561155d57600080fd5b5035919050565b6000806040838503121561157757600080fd5b8235611582816114ad565b946020939093013593505050565b600080604083850312156115a357600080fd5b82356115ae816114ad565b915060208301356115be816114ad565b809150509250929050565b60ff8116811461054e57600080fd5b6000602082840312156115ea57600080fd5b813561133c816115c9565b60005b838110156116105781810151838201526020016115f8565b50506000910152565b60208152600082518060208401526116388160408501602087016115f5565b601f01601f19169190910160400192915050565b60008060006060848603121561166157600080fd5b833561166c816114ad565b9250602084013561167c816114ad565b929592945050506040919091013590565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b6000602082840312156116ed57600080fd5b815161133c816114ad565b60006020828403121561170a57600080fd5b8151801515811461133c57600080fd5b634e487b7160e01b600052601160045260246000fd5b808201808211156109245761092461171a565b818103818111156109245761092461171a565b80820281158282048414176109245761092461171a565b60008261178a57634e487b7160e01b600052601260045260246000fd5b500490565b6000602082840312156117a157600080fd5b5051919050565b6000602082840312156117ba57600080fd5b815161133c816115c9565b600082516117d78184602087016115f5565b919091019291505056fe4261736520537472617465677920696d706c656d656e746174696f6e20746f20696e68657269742066726f6d20666f72206d6f726520636f6d706c657820696d706c656d656e746174696f6e73a26469706673582212204c8e87547d82a7330c17070369c3af5ade84d7601b9b5c83d76e780ad5bee50464736f6c634300081b0033", } // StrategyBaseTVLLimitsABI is the input ABI used to generate the binding from. diff --git a/pkg/bindings/StrategyFactory/binding.go b/pkg/bindings/StrategyFactory/binding.go index cd0633c74..00a86d7b4 100644 --- a/pkg/bindings/StrategyFactory/binding.go +++ b/pkg/bindings/StrategyFactory/binding.go @@ -31,8 +31,8 @@ var ( // StrategyFactoryMetaData contains all meta data concerning the StrategyFactory contract. var StrategyFactoryMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_strategyManager\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"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\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"},{\"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\":\"setPauserRegistry\",\"inputs\":[{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setThirdPartyTransfersForbidden\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"value\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"strategyBeacon\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIBeacon\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"strategyManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"whitelistStrategies\",\"inputs\":[{\"name\":\"strategiesToWhitelist\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"thirdPartyTransfersForbiddenValues\",\"type\":\"bool[]\",\"internalType\":\"bool[]\"}],\"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\":\"PauserRegistrySet\",\"inputs\":[{\"name\":\"pauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"}],\"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}]", - Bin: "0x60a06040523480156200001157600080fd5b50604051620024ae380380620024ae833981016040819052620000349162000114565b6001600160a01b0381166080526200004b62000052565b5062000146565b603354610100900460ff1615620000bf5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60335460ff908116101562000112576033805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6000602082840312156200012757600080fd5b81516001600160a01b03811681146200013f57600080fd5b9392505050565b608051612329620001856000396000818161019701528181610829015281816108cc01528181610a1d01528181610d4a015261111101526123296000f3fe60806040523480156200001157600080fd5b5060043610620001455760003560e01c80636b9b622911620000bb578063f0062d9a116200007a578063f0062d9a14620002e1578063f2fde38b14620002f5578063fabc1cbc146200030c578063fe38b32d1462000323578063fe575a87146200033a57600080fd5b80636b9b62291462000283578063715018a6146200029a578063886f119514620002a45780638da5cb5b14620002b8578063be20309414620002ca57600080fd5b8063581dfd651162000108578063581dfd6514620001ed578063595c6a6714620002195780635ac86ab714620002235780635c975abb146200025a578063697d54b4146200026c57600080fd5b806310d67a2f146200014a578063136439dd146200016357806323103c41146200017a57806339b70e3814620001915780634e5a426314620001d6575b600080fd5b620001616200015b366004620014d8565b62000360565b005b6200016162000174366004620014ff565b62000424565b620001616200018b36600462001568565b6200056b565b620001b97f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020015b60405180910390f35b62000161620001e7366004620015bd565b6200089b565b620001b9620001fe366004620014d8565b6001602052600090815260409020546001600160a01b031681565b620001616200092f565b6200024962000234366004620015fb565b609954600160ff9092169190911b9081161490565b6040519015158152602001620001cd565b609954604051908152602001620001cd565b620001616200027d36600462001620565b620009fc565b620001b962000294366004620014d8565b62000a5a565b6200016162000dc1565b609854620001b9906001600160a01b031681565b6066546001600160a01b0316620001b9565b62000161620002db36600462001693565b62000dd9565b600054620001b9906001600160a01b031681565b6200016162000306366004620014d8565b62000f0f565b620001616200031d366004620014ff565b62000f8b565b620001616200033436600462001568565b620010f0565b620002496200034b366004620014d8565b60026020526000908152604090205460ff1681565b609860009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015620003b4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003da9190620016ed565b6001600160a01b0316336001600160a01b031614620004165760405162461bcd60e51b81526004016200040d906200170d565b60405180910390fd5b62000421816200114a565b50565b60985460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa1580156200046d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000493919062001757565b620004b25760405162461bcd60e51b81526004016200040d9062001777565b609954818116146200052d5760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c697479000000000000000060648201526084016200040d565b609981905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b6200057562001243565b60008167ffffffffffffffff811115620005935762000593620017bf565b604051908082528060200260200182016040528015620005bd578160200160208202803683370190505b5090506000805b83811015620008075760026000868684818110620005e657620005e6620017d5565b9050602002016020810190620005fd9190620014d8565b6001600160a01b0316815260208101919091526040016000205460ff16156200069b5760405162461bcd60e51b815260206004820152604360248201527f5374726174656779466163746f72792e626c61636b6c697374546f6b656e733a60448201527f2043616e6e6f7420626c61636b6c697374206465706c6f79656420737472617460648201526265677960e81b608482015260a4016200040d565b600160026000878785818110620006b657620006b6620017d5565b9050602002016020810190620006cd9190620014d8565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790557f75519c51f39873ec0e27dd3bbc09549e4865a113f505393fb9eab5898f6418b38585838181106200072b576200072b620017d5565b9050602002016020810190620007429190620014d8565b6040516001600160a01b03909116815260200160405180910390a1600060016000878785818110620007785762000778620017d5565b90506020020160208101906200078f9190620014d8565b6001600160a01b0390811682526020820192909252604001600020541690508015620007f35780848481518110620007cb57620007cb620017d5565b6001600160a01b039092166020928302919091019091015282620007ef81620017eb565b9350505b50620007ff81620017eb565b9050620005c4565b50808252801562000895576040516316bb16b760e31b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063b5d8b5b890620008609085906004016200185b565b600060405180830381600087803b1580156200087b57600080fd5b505af115801562000890573d6000803e3d6000fd5b505050505b50505050565b620008a562001243565b604051634e5a426360e01b81526001600160a01b03838116600483015282151560248301527f00000000000000000000000000000000000000000000000000000000000000001690634e5a4263906044015b600060405180830381600087803b1580156200091257600080fd5b505af115801562000927573d6000803e3d6000fd5b505050505050565b60985460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa15801562000978573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200099e919062001757565b620009bd5760405162461bcd60e51b81526004016200040d9062001777565b600019609981905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b62000a0662001243565b60405163df5b354760e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063df5b35479062000860908790879087908790600401620018b2565b60995460009081906001908116141562000ab75760405162461bcd60e51b815260206004820152601960248201527f5061757361626c653a20696e646578206973207061757365640000000000000060448201526064016200040d565b6001600160a01b03831660009081526002602052604090205460ff161562000b485760405162461bcd60e51b815260206004820152603760248201527f5374726174656779466163746f72792e6465706c6f794e65775374726174656760448201527f793a20546f6b656e20697320626c61636b6c697374656400000000000000000060648201526084016200040d565b6001600160a01b03838116600090815260016020526040902054161562000be65760405162461bcd60e51b8152602060048201526044602482018190527f5374726174656779466163746f72792e6465706c6f794e657753747261746567908201527f793a20537472617465677920616c72656164792065786973747320666f72207460648201526337b5b2b760e11b608482015260a4016200040d565b600080546098546040516001600160a01b038781166024830152918216604482015291169063485cc95560e01b9060640160408051601f198184030181529181526020820180516001600160e01b03166001600160e01b031990941693909317909252905162000c5690620014b4565b62000c6392919062001916565b604051809103906000f08015801562000c80573d6000803e3d6000fd5b50905062000c8f84826200129f565b604080516001808252818301909252600091602080830190803683375050604080516001808252818301909252929350600092915060208083019080368337019050509050828260008151811062000ceb5762000ceb620017d5565b60200260200101906001600160a01b031690816001600160a01b03168152505060008160008151811062000d235762000d23620017d5565b9115156020928302919091019091015260405163df5b354760e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063df5b35479062000d8390859085906004016200197e565b600060405180830381600087803b15801562000d9e57600080fd5b505af115801562000db3573d6000803e3d6000fd5b509498975050505050505050565b62000dcb62001243565b62000dd760006200130a565b565b603354610100900460ff161580801562000dfa5750603354600160ff909116105b8062000e165750303b15801562000e16575060335460ff166001145b62000e7b5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016200040d565b6033805460ff19166001179055801562000e9f576033805461ff0019166101001790555b62000eaa856200130a565b62000eb684846200135c565b62000ec1826200144b565b801562000f08576033805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050565b62000f1962001243565b6001600160a01b03811662000f805760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016200040d565b62000421816200130a565b609860009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000fdf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620010059190620016ed565b6001600160a01b0316336001600160a01b031614620010385760405162461bcd60e51b81526004016200040d906200170d565b609954198119609954191614620010b85760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c697479000000000000000060648201526084016200040d565b609981905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200162000560565b620010fa62001243565b6040516316bb16b760e31b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063b5d8b5b890620008f79085908590600401620019db565b6001600160a01b038116620011da5760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a4016200040d565b609854604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1609880546001600160a01b0319166001600160a01b0392909216919091179055565b6066546001600160a01b0316331462000dd75760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016200040d565b6001600160a01b0382811660008181526001602090815260409182902080546001600160a01b031916948616948517905581519283528201929092527f6852a55230ef089d785bce7ffbf757985de34026df90a87d7b4a6e56f95d251f910160405180910390a15050565b606680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6098546001600160a01b03161580156200137e57506001600160a01b03821615155b620014025760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a4016200040d565b609981905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a262001447826200114a565b5050565b600054604080516001600160a01b03928316815291831660208301527fe21755962a7d7e100b59b9c3e4d4b54085b146313719955efb6a7a25c5c7feee910160405180910390a1600080546001600160a01b0319166001600160a01b0392909216919091179055565b6108fa80620019fa83390190565b6001600160a01b03811681146200042157600080fd5b600060208284031215620014eb57600080fd5b8135620014f881620014c2565b9392505050565b6000602082840312156200151257600080fd5b5035919050565b60008083601f8401126200152c57600080fd5b50813567ffffffffffffffff8111156200154557600080fd5b6020830191508360208260051b85010111156200156157600080fd5b9250929050565b600080602083850312156200157c57600080fd5b823567ffffffffffffffff8111156200159457600080fd5b620015a28582860162001519565b90969095509350505050565b80151581146200042157600080fd5b60008060408385031215620015d157600080fd5b8235620015de81620014c2565b91506020830135620015f081620015ae565b809150509250929050565b6000602082840312156200160e57600080fd5b813560ff81168114620014f857600080fd5b600080600080604085870312156200163757600080fd5b843567ffffffffffffffff808211156200165057600080fd5b6200165e8883890162001519565b909650945060208701359150808211156200167857600080fd5b50620016878782880162001519565b95989497509550505050565b60008060008060808587031215620016aa57600080fd5b8435620016b781620014c2565b93506020850135620016c981620014c2565b9250604085013591506060850135620016e281620014c2565b939692955090935050565b6000602082840312156200170057600080fd5b8151620014f881620014c2565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b6000602082840312156200176a57600080fd5b8151620014f881620015ae565b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b60006000198214156200180e57634e487b7160e01b600052601160045260246000fd5b5060010190565b600081518084526020808501945080840160005b83811015620018505781516001600160a01b03168752958201959082019060010162001829565b509495945050505050565b602081526000620014f8602083018462001815565b8183526000602080850194508260005b85811015620018505781356200189681620014c2565b6001600160a01b03168752958201959082019060010162001880565b604081526000620018c860408301868862001870565b8281036020848101919091528482528591810160005b8681101562001909578335620018f481620015ae565b151582529282019290820190600101620018de565b5098975050505050505050565b60018060a01b038316815260006020604081840152835180604085015260005b81811015620019545785810183015185820160600152820162001936565b8181111562001967576000606083870101525b50601f01601f191692909201606001949350505050565b60408152600062001993604083018562001815565b82810360208481019190915284518083528582019282019060005b81811015620019ce578451151583529383019391830191600101620019ae565b5090979650505050505050565b602081526000620019f160208301848662001870565b94935050505056fe60806040526040516108fa3803806108fa83398101604081905261002291610456565b61002e82826000610035565b5050610580565b61003e83610100565b6040516001600160a01b038416907f1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e90600090a260008251118061007f5750805b156100fb576100f9836001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100e99190610516565b836102a360201b6100291760201c565b505b505050565b610113816102cf60201b6100551760201c565b6101725760405162461bcd60e51b815260206004820152602560248201527f455243313936373a206e657720626561636f6e206973206e6f74206120636f6e6044820152641d1c9858dd60da1b60648201526084015b60405180910390fd5b6101e6816001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156101b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101d79190610516565b6102cf60201b6100551760201c565b61024b5760405162461bcd60e51b815260206004820152603060248201527f455243313936373a20626561636f6e20696d706c656d656e746174696f6e206960448201526f1cc81b9bdd08184818dbdb9d1c9858dd60821b6064820152608401610169565b806102827fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d5060001b6102de60201b6100641760201c565b80546001600160a01b0319166001600160a01b039290921691909117905550565b60606102c883836040518060600160405280602781526020016108d3602791396102e1565b9392505050565b6001600160a01b03163b151590565b90565b60606001600160a01b0384163b6103495760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b6064820152608401610169565b600080856001600160a01b0316856040516103649190610531565b600060405180830381855af49150503d806000811461039f576040519150601f19603f3d011682016040523d82523d6000602084013e6103a4565b606091505b5090925090506103b58282866103bf565b9695505050505050565b606083156103ce5750816102c8565b8251156103de5782518084602001fd5b8160405162461bcd60e51b8152600401610169919061054d565b80516001600160a01b038116811461040f57600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b8381101561044557818101518382015260200161042d565b838111156100f95750506000910152565b6000806040838503121561046957600080fd5b610472836103f8565b60208401519092506001600160401b038082111561048f57600080fd5b818501915085601f8301126104a357600080fd5b8151818111156104b5576104b5610414565b604051601f8201601f19908116603f011681019083821181831017156104dd576104dd610414565b816040528281528860208487010111156104f657600080fd5b61050783602083016020880161042a565b80955050505050509250929050565b60006020828403121561052857600080fd5b6102c8826103f8565b6000825161054381846020870161042a565b9190910192915050565b602081526000825180602084015261056c81604085016020870161042a565b601f01601f19169190910160400192915050565b6103448061058f6000396000f3fe60806040523661001357610011610017565b005b6100115b610027610022610067565b610100565b565b606061004e83836040518060600160405280602781526020016102e860279139610124565b9392505050565b6001600160a01b03163b151590565b90565b600061009a7fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50546001600160a01b031690565b6001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100fb919061023f565b905090565b3660008037600080366000845af43d6000803e80801561011f573d6000f35b3d6000fd5b60606001600160a01b0384163b6101915760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b60648201526084015b60405180910390fd5b600080856001600160a01b0316856040516101ac9190610298565b600060405180830381855af49150503d80600081146101e7576040519150601f19603f3d011682016040523d82523d6000602084013e6101ec565b606091505b50915091506101fc828286610206565b9695505050505050565b6060831561021557508161004e565b8251156102255782518084602001fd5b8160405162461bcd60e51b815260040161018891906102b4565b60006020828403121561025157600080fd5b81516001600160a01b038116811461004e57600080fd5b60005b8381101561028357818101518382015260200161026b565b83811115610292576000848401525b50505050565b600082516102aa818460208701610268565b9190910192915050565b60208152600082518060208401526102d3816040850160208701610268565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212206225174df4b558257f66ac9aa53b52c29cdd29a561b03eb6d75a95018aff3e5864736f6c634300080c0033416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212205ec4c51d66eda3a5cc6c4836684b038a334a62fe205ea7e8aaa91c0a44cd1bb364736f6c634300080c0033", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_strategyManager\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"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\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"},{\"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\":\"setPauserRegistry\",\"inputs\":[{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setThirdPartyTransfersForbidden\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"value\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"strategyBeacon\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIBeacon\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"strategyManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"whitelistStrategies\",\"inputs\":[{\"name\":\"strategiesToWhitelist\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"thirdPartyTransfersForbiddenValues\",\"type\":\"bool[]\",\"internalType\":\"bool[]\"}],\"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\":\"PauserRegistrySet\",\"inputs\":[{\"name\":\"pauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyBeaconModified\",\"inputs\":[{\"name\":\"previousBeacon\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIBeacon\"},{\"name\":\"newBeacon\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIBeacon\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategySetForToken\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIERC20\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TokenBlacklisted\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIERC20\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AlreadyBlacklisted\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"BlacklistedToken\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CurrentlyPaused\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNewPausedStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyPauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnpauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyAlreadyExists\",\"inputs\":[]}]", + Bin: "0x60a060405234801561001057600080fd5b50604051611df2380380611df283398101604081905261002f9161010a565b6001600160a01b03811660805261004461004a565b5061013a565b603354610100900460ff16156100b65760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60335460ff9081161015610108576033805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b60006020828403121561011c57600080fd5b81516001600160a01b038116811461013357600080fd5b9392505050565b608051611c7a61017860003960008181610171015281816106d901528181610776015281816108be01528181610aee0152610e400152611c7a6000f3fe608060405234801561001057600080fd5b506004361061012c5760003560e01c80636b9b6229116100ad578063f0062d9a11610071578063f0062d9a1461029d578063f2fde38b146102b0578063fabc1cbc146102c3578063fe38b32d146102d6578063fe575a87146102e957600080fd5b80636b9b62291461024b578063715018a61461025e578063886f1195146102665780638da5cb5b14610279578063be2030941461028a57600080fd5b8063581dfd65116100f4578063581dfd65146101c3578063595c6a67146101ec5780635ac86ab7146101f45780635c975abb14610227578063697d54b41461023857600080fd5b806310d67a2f14610131578063136439dd1461014657806323103c411461015957806339b70e381461016c5780634e5a4263146101b0575b600080fd5b61014461013f36600461112e565b61030c565b005b610144610154366004611152565b6103c0565b6101446101673660046111b7565b6104ab565b6101937f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020015b60405180910390f35b6101446101be366004611207565b610747565b6101936101d136600461112e565b6001602052600090815260409020546001600160a01b031681565b6101446107d7565b610217610202366004611240565b609954600160ff9092169190911b9081161490565b60405190151581526020016101a7565b6099546040519081526020016101a7565b610144610246366004611263565b61089f565b61019361025936600461112e565b6108f9565b610144610b61565b609854610193906001600160a01b031681565b6066546001600160a01b0316610193565b6101446102983660046112d4565b610b75565b600054610193906001600160a01b031681565b6101446102be36600461112e565b610ca3565b6101446102d1366004611152565b610d19565b6101446102e43660046111b7565b610e21565b6102176102f736600461112e565b60026020526000908152604090205460ff1681565b609860009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561035f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103839190611327565b6001600160a01b0316336001600160a01b0316146103b45760405163794821ff60e01b815260040160405180910390fd5b6103bd81610e77565b50565b60985460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015610408573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061042c9190611344565b61044957604051631d77d47760e21b815260040160405180910390fd5b6099548181161461046d5760405163c61dca5d60e01b815260040160405180910390fd5b609981905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b6104b3610f07565b60008167ffffffffffffffff8111156104ce576104ce611361565b6040519080825280602002602001820160405280156104f7578160200160208202803683370190505b5090506000805b838110156106b8576002600086868481811061051c5761051c611377565b9050602002016020810190610531919061112e565b6001600160a01b0316815260208101919091526040016000205460ff161561056c5760405163f53de75f60e01b815260040160405180910390fd5b60016002600087878581811061058457610584611377565b9050602002016020810190610599919061112e565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790557f75519c51f39873ec0e27dd3bbc09549e4865a113f505393fb9eab5898f6418b38585838181106105f4576105f4611377565b9050602002016020810190610609919061112e565b6040516001600160a01b03909116815260200160405180910390a160006001600087878581811061063c5761063c611377565b9050602002016020810190610651919061112e565b6001600160a01b03908116825260208201929092526040016000205416905080156106af578084848151811061068957610689611377565b6001600160a01b0390921660209283029190910190910152826106ab8161138d565b9350505b506001016104fe565b508082528015610741576040516316bb16b760e31b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063b5d8b5b89061070e9085906004016113f9565b600060405180830381600087803b15801561072857600080fd5b505af115801561073c573d6000803e3d6000fd5b505050505b50505050565b61074f610f07565b604051634e5a426360e01b81526001600160a01b03838116600483015282151560248301527f00000000000000000000000000000000000000000000000000000000000000001690634e5a4263906044015b600060405180830381600087803b1580156107bb57600080fd5b505af11580156107cf573d6000803e3d6000fd5b505050505050565b60985460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa15801561081f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108439190611344565b61086057604051631d77d47760e21b815260040160405180910390fd5b600019609981905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b6108a7610f07565b60405163df5b354760e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063df5b35479061070e90879087908790879060040161144c565b60995460009081906001908116036109245760405163840a48d560e01b815260040160405180910390fd5b6001600160a01b03831660009081526002602052604090205460ff161561095e5760405163091867bd60e11b815260040160405180910390fd5b6001600160a01b0383811660009081526001602052604090205416156109975760405163c45546f760e01b815260040160405180910390fd5b600080546098546040516001600160a01b038781166024830152918216604482015291169063485cc95560e01b9060640160408051601f198184030181529181526020820180516001600160e01b03166001600160e01b0319909416939093179092529051610a059061110c565b610a109291906114aa565b604051809103906000f080158015610a2c573d6000803e3d6000fd5b509050610a398482610f61565b6040805160018082528183019092526000916020808301908036833750506040805160018082528183019092529293506000929150602080830190803683370190505090508282600081518110610a9257610a92611377565b60200260200101906001600160a01b031690816001600160a01b031681525050600081600081518110610ac757610ac7611377565b9115156020928302919091019091015260405163df5b354760e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063df5b354790610b259085908590600401611507565b600060405180830381600087803b158015610b3f57600080fd5b505af1158015610b53573d6000803e3d6000fd5b509498975050505050505050565b610b69610f07565b610b736000610fcc565b565b603354610100900460ff1615808015610b955750603354600160ff909116105b80610baf5750303b158015610baf575060335460ff166001145b610c175760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6033805460ff191660011790558015610c3a576033805461ff0019166101001790555b610c4385610fcc565b610c4d848461101e565b610c56826110a3565b8015610c9c576033805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050565b610cab610f07565b6001600160a01b038116610d105760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610c0e565b6103bd81610fcc565b609860009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d6c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d909190611327565b6001600160a01b0316336001600160a01b031614610dc15760405163794821ff60e01b815260040160405180910390fd5b609954198119609954191614610dea5760405163c61dca5d60e01b815260040160405180910390fd5b609981905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c906020016104a0565b610e29610f07565b6040516316bb16b760e31b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063b5d8b5b8906107a19085908590600401611563565b6001600160a01b038116610e9e576040516339b190bb60e11b815260040160405180910390fd5b609854604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1609880546001600160a01b0319166001600160a01b0392909216919091179055565b6066546001600160a01b03163314610b735760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c0e565b6001600160a01b0382811660008181526001602090815260409182902080546001600160a01b031916948616948517905581519283528201929092527f6852a55230ef089d785bce7ffbf757985de34026df90a87d7b4a6e56f95d251f910160405180910390a15050565b606680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6098546001600160a01b031615801561103f57506001600160a01b03821615155b61105c576040516339b190bb60e11b815260040160405180910390fd5b609981905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a261109f82610e77565b5050565b600054604080516001600160a01b03928316815291831660208301527fe21755962a7d7e100b59b9c3e4d4b54085b146313719955efb6a7a25c5c7feee910160405180910390a1600080546001600160a01b0319166001600160a01b0392909216919091179055565b6106c58061158083390190565b6001600160a01b03811681146103bd57600080fd5b60006020828403121561114057600080fd5b813561114b81611119565b9392505050565b60006020828403121561116457600080fd5b5035919050565b60008083601f84011261117d57600080fd5b50813567ffffffffffffffff81111561119557600080fd5b6020830191508360208260051b85010111156111b057600080fd5b9250929050565b600080602083850312156111ca57600080fd5b823567ffffffffffffffff8111156111e157600080fd5b6111ed8582860161116b565b90969095509350505050565b80151581146103bd57600080fd5b6000806040838503121561121a57600080fd5b823561122581611119565b91506020830135611235816111f9565b809150509250929050565b60006020828403121561125257600080fd5b813560ff8116811461114b57600080fd5b6000806000806040858703121561127957600080fd5b843567ffffffffffffffff81111561129057600080fd5b61129c8782880161116b565b909550935050602085013567ffffffffffffffff8111156112bc57600080fd5b6112c88782880161116b565b95989497509550505050565b600080600080608085870312156112ea57600080fd5b84356112f581611119565b9350602085013561130581611119565b925060408501359150606085013561131c81611119565b939692955090935050565b60006020828403121561133957600080fd5b815161114b81611119565b60006020828403121561135657600080fd5b815161114b816111f9565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6000600182016113ad57634e487b7160e01b600052601160045260246000fd5b5060010190565b600081518084526020840193506020830160005b828110156113ef5781516001600160a01b03168652602095860195909101906001016113c8565b5093949350505050565b60208152600061114b60208301846113b4565b81835260208301925060008160005b848110156113ef57813561142e81611119565b6001600160a01b03168652602095860195919091019060010161141b565b60408152600061146060408301868861140c565b82810360208085019190915284825285910160005b8581101561149e578235611488816111f9565b1515825260209283019290910190600101611475565b50979650505050505050565b60018060a01b0383168152604060208201526000825180604084015260005b818110156114e657602081860181015160608684010152016114c9565b506000606082850101526060601f19601f8301168401019150509392505050565b60408152600061151a60408301856113b4565b828103602084015280845180835260208301915060208601925060005b818110156115575783511515835260209384019390920191600101611537565b50909695505050505050565b60208152600061157760208301848661140c565b94935050505056fe60806040526040516106c53803806106c583398101604081905261002291610413565b61002e82826000610035565b5050610543565b61003e836100f6565b6040516001600160a01b038416907f1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e90600090a260008251118061007f5750805b156100f1576100ef836001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100e991906104d9565b8361027a565b505b505050565b6001600160a01b0381163b6101605760405162461bcd60e51b815260206004820152602560248201527f455243313936373a206e657720626561636f6e206973206e6f74206120636f6e6044820152641d1c9858dd60da1b60648201526084015b60405180910390fd5b6101d4816001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156101a1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101c591906104d9565b6001600160a01b03163b151590565b6102395760405162461bcd60e51b815260206004820152603060248201527f455243313936373a20626561636f6e20696d706c656d656e746174696f6e206960448201526f1cc81b9bdd08184818dbdb9d1c9858dd60821b6064820152608401610157565b7fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d5080546001600160a01b0319166001600160a01b0392909216919091179055565b606061029f838360405180606001604052806027815260200161069e602791396102a6565b9392505050565b60606001600160a01b0384163b61030e5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b6064820152608401610157565b600080856001600160a01b03168560405161032991906104f4565b600060405180830381855af49150503d8060008114610364576040519150601f19603f3d011682016040523d82523d6000602084013e610369565b606091505b50909250905061037a828286610384565b9695505050505050565b6060831561039357508161029f565b8251156103a35782518084602001fd5b8160405162461bcd60e51b81526004016101579190610510565b80516001600160a01b03811681146103d457600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b8381101561040a5781810151838201526020016103f2565b50506000910152565b6000806040838503121561042657600080fd5b61042f836103bd565b60208401519092506001600160401b0381111561044b57600080fd5b8301601f8101851361045c57600080fd5b80516001600160401b03811115610475576104756103d9565b604051601f8201601f19908116603f011681016001600160401b03811182821017156104a3576104a36103d9565b6040528181528282016020018710156104bb57600080fd5b6104cc8260208301602086016103ef565b8093505050509250929050565b6000602082840312156104eb57600080fd5b61029f826103bd565b600082516105068184602087016103ef565b9190910192915050565b602081526000825180602084015261052f8160408501602087016103ef565b601f01601f19169190910160400192915050565b61014c806105526000396000f3fe60806040523661001357610011610017565b005b6100115b610027610022610029565b6100c2565b565b600061005c7fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50546001600160a01b031690565b6001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610099573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100bd91906100e6565b905090565b3660008037600080366000845af43d6000803e8080156100e1573d6000f35b3d6000fd5b6000602082840312156100f857600080fd5b81516001600160a01b038116811461010f57600080fd5b939250505056fea264697066735822122073f44b13ad6a41f166bfe1da0f67ccdfa4d7fa137b8df1dcc52307b737bea46264736f6c634300081b0033416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220029228b7e8411e572616782cac9c5030117d04118b5def16958beba8a8ef2b7264736f6c634300081b0033", } // StrategyFactoryABI is the input ABI used to generate the binding from. diff --git a/pkg/bindings/StrategyFactoryStorage/binding.go b/pkg/bindings/StrategyFactoryStorage/binding.go index 3a164f025..e7c06ebae 100644 --- a/pkg/bindings/StrategyFactoryStorage/binding.go +++ b/pkg/bindings/StrategyFactoryStorage/binding.go @@ -31,7 +31,7 @@ var ( // StrategyFactoryStorageMetaData contains all meta data concerning the StrategyFactoryStorage contract. var StrategyFactoryStorageMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"function\",\"name\":\"deployNewStrategy\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[{\"name\":\"newStrategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"deployedStrategies\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isBlacklisted\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"removeStrategiesFromWhitelist\",\"inputs\":[{\"name\":\"strategiesToRemoveFromWhitelist\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setThirdPartyTransfersForbidden\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"value\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"strategyBeacon\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIBeacon\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"whitelistStrategies\",\"inputs\":[{\"name\":\"strategiesToWhitelist\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"thirdPartyTransfersForbiddenValues\",\"type\":\"bool[]\",\"internalType\":\"bool[]\"}],\"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}]", + 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\":\"setThirdPartyTransfersForbidden\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"value\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"strategyBeacon\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIBeacon\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"whitelistStrategies\",\"inputs\":[{\"name\":\"strategiesToWhitelist\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"thirdPartyTransfersForbiddenValues\",\"type\":\"bool[]\",\"internalType\":\"bool[]\"}],\"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. diff --git a/pkg/bindings/StrategyManager/binding.go b/pkg/bindings/StrategyManager/binding.go index 65ecc0fdd..58628ec1a 100644 --- a/pkg/bindings/StrategyManager/binding.go +++ b/pkg/bindings/StrategyManager/binding.go @@ -31,8 +31,8 @@ var ( // StrategyManagerMetaData contains all meta data concerning the StrategyManager contract. var StrategyManagerMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_delegation\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"},{\"name\":\"_eigenPodManager\",\"type\":\"address\",\"internalType\":\"contractIEigenPodManager\"},{\"name\":\"_slasher\",\"type\":\"address\",\"internalType\":\"contractISlasher\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"DEPOSIT_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"DOMAIN_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"addShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addStrategiesToDepositWhitelist\",\"inputs\":[{\"name\":\"strategiesToWhitelist\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"thirdPartyTransfersForbiddenValues\",\"type\":\"bool[]\",\"internalType\":\"bool[]\"}],\"outputs\":[],\"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\":\"shares\",\"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\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"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\":\"getDeposits\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialStrategyWhitelister\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"initialPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"nonces\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"removeShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeStrategiesFromDepositWhitelist\",\"inputs\":[{\"name\":\"strategiesToRemoveFromWhitelist\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setPauserRegistry\",\"inputs\":[{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setStrategyWhitelister\",\"inputs\":[{\"name\":\"newStrategyWhitelister\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setThirdPartyTransfersForbidden\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"value\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"slasher\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractISlasher\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"stakerStrategyList\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"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\":\"stakerStrategyShares\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"strategyIsWhitelistedForDeposit\",\"inputs\":[{\"name\":\"\",\"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\":\"thirdPartyTransfersForbidden\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawSharesAsTokens\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"Deposit\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIERC20\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PauserRegistrySet\",\"inputs\":[{\"name\":\"pauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"}],\"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\":\"event\",\"name\":\"UpdatedThirdPartyTransfersForbidden\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"value\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false}]", - Bin: "0x6101006040523480156200001257600080fd5b506040516200338a3803806200338a833981016040819052620000359162000140565b6001600160a01b0380841660805280831660a052811660c0526200005862000065565b50504660e0525062000194565b600054610100900460ff1615620000d25760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101562000125576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146200013d57600080fd5b50565b6000806000606084860312156200015657600080fd5b8351620001638162000127565b6020850151909350620001768162000127565b6040850151909250620001898162000127565b809150509250925092565b60805160a05160c05160e0516131a0620001ea60003960006114bb0152600061046e0152600061028501526000818161051a01528181610b8401528181610ed101528181610f250152611a7101526131a06000f3fe608060405234801561001057600080fd5b50600436106102065760003560e01c80638da5cb5b1161011a578063c6656702116100ad578063df5cf7231161007c578063df5cf72314610515578063e7a050aa1461053c578063f2fde38b1461054f578063f698da2514610562578063fabc1cbc1461056a57600080fd5b8063c6656702146104c9578063cbc2bd62146104dc578063cf756fdf146104ef578063df5b35471461050257600080fd5b8063b1344271116100e9578063b134427114610469578063b5d8b5b814610490578063c4623ea1146104a3578063c608c7f3146104b657600080fd5b80638da5cb5b1461040157806394f649dd14610412578063967fc0d2146104335780639b4da03d1461044657600080fd5b80635ac86ab71161019d5780637a7e0d921161016c5780637a7e0d92146103675780637ecebe0014610392578063886f1195146103b25780638b8aac3c146103c55780638c80d4e5146103ee57600080fd5b80635ac86ab7146103015780635c975abb14610334578063663c1de41461033c578063715018a61461035f57600080fd5b80634665bcda116101d95780634665bcda1461028057806348825e94146102bf5780634e5a4263146102e6578063595c6a67146102f957600080fd5b806310d67a2f1461020b578063136439dd1461022057806320606b701461023357806332e89ace1461026d575b600080fd5b61021e6102193660046129e8565b61057d565b005b61021e61022e366004612a05565b610639565b61025a7f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b6040519081526020015b60405180910390f35b61025a61027b366004612a34565b610778565b6102a77f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610264565b61025a7f4337f82d142e41f2a8c10547cd8c859bddb92262a61058e77842e24d9dea922481565b61021e6102f4366004612b3d565b610a66565b61021e610a9e565b61032461030f366004612b76565b609854600160ff9092169190911b9081161490565b6040519015158152602001610264565b60985461025a565b61032461034a3660046129e8565b60d16020526000908152604090205460ff1681565b61021e610b65565b61025a610375366004612b99565b60cd60209081526000928352604080842090915290825290205481565b61025a6103a03660046129e8565b60ca6020526000908152604090205481565b6097546102a7906001600160a01b031681565b61025a6103d33660046129e8565b6001600160a01b0316600090815260ce602052604090205490565b61021e6103fc366004612bc7565b610b79565b6033546001600160a01b03166102a7565b6104256104203660046129e8565b610bd2565b604051610264929190612c08565b60cb546102a7906001600160a01b031681565b6103246104543660046129e8565b60d36020526000908152604090205460ff1681565b6102a77f000000000000000000000000000000000000000000000000000000000000000081565b61021e61049e366004612cd1565b610d52565b61021e6104b1366004612d13565b610ec6565b61021e6104c4366004612d64565b610f1a565b61021e6104d73660046129e8565b610fd2565b6102a76104ea366004612db7565b610fe3565b61021e6104fd366004612d13565b61101b565b61021e610510366004612de3565b61114f565b6102a77f000000000000000000000000000000000000000000000000000000000000000081565b61025a61054a366004612bc7565b611378565b61021e61055d3660046129e8565b611441565b61025a6114b7565b61021e610578366004612a05565b6114f5565b609760009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156105d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105f49190612e4f565b6001600160a01b0316336001600160a01b03161461062d5760405162461bcd60e51b815260040161062490612e6c565b60405180910390fd5b61063681611651565b50565b60975460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015610681573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106a59190612eb6565b6106c15760405162461bcd60e51b815260040161062490612ed3565b6098548181161461073a5760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c69747900000000000000006064820152608401610624565b609881905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b6098546000908190600190811614156107cf5760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b6044820152606401610624565b600260655414156108225760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610624565b60026065556001600160a01b038816600090815260d3602052604090205460ff16156108c95760405162461bcd60e51b815260206004820152604a60248201527f53747261746567794d616e616765722e6465706f736974496e746f537472617460448201527f656779576974685369676e61747572653a207468697264207472616e736665726064820152691cc8191a5cd8589b195960b21b608482015260a401610624565b4284101561094b5760405162461bcd60e51b815260206004820152604360248201527f53747261746567794d616e616765722e6465706f736974496e746f537472617460448201527f656779576974685369676e61747572653a207369676e617475726520657870696064820152621c995960ea1b608482015260a401610624565b6001600160a01b03858116600081815260ca602090815260408083205481517f4337f82d142e41f2a8c10547cd8c859bddb92262a61058e77842e24d9dea922493810193909352908201939093528b84166060820152928a16608084015260a0830189905260c0830182905260e0830187905290916101000160408051601f1981840301815291815281516020928301206001600160a01b038a16600090815260ca9093529082206001850190559150610a036114b7565b60405161190160f01b6020820152602281019190915260428101839052606201604051602081830303815290604052805190602001209050610a46888288611748565b610a52888c8c8c611907565b60016065559b9a5050505050505050505050565b60cb546001600160a01b03163314610a905760405162461bcd60e51b815260040161062490612f1b565b610a9a8282611ad6565b5050565b60975460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015610ae6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b0a9190612eb6565b610b265760405162461bcd60e51b815260040161062490612ed3565b600019609881905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b610b6d611b44565b610b776000611b9e565b565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610bc15760405162461bcd60e51b815260040161062490612f85565b610bcc838383611bf0565b50505050565b6001600160a01b038116600090815260ce60205260408120546060918291908167ffffffffffffffff811115610c0a57610c0a612a1e565b604051908082528060200260200182016040528015610c33578160200160208202803683370190505b50905060005b82811015610cc4576001600160a01b038616600090815260cd6020908152604080832060ce9092528220805491929184908110610c7857610c78612fe3565b60009182526020808320909101546001600160a01b031683528201929092526040019020548251839083908110610cb157610cb1612fe3565b6020908102919091010152600101610c39565b5060ce6000866001600160a01b03166001600160a01b031681526020019081526020016000208181805480602002602001604051908101604052809291908181526020018280548015610d4057602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610d22575b50505050509150935093505050915091565b60cb546001600160a01b03163314610d7c5760405162461bcd60e51b815260040161062490612f1b565b8060005b81811015610bcc5760d16000858584818110610d9e57610d9e612fe3565b9050602002016020810190610db391906129e8565b6001600160a01b0316815260208101919091526040016000205460ff1615610ebe57600060d16000868685818110610ded57610ded612fe3565b9050602002016020810190610e0291906129e8565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790557f4074413b4b443e4e58019f2855a8765113358c7c72e39509c6af45fc0f5ba030848483818110610e5d57610e5d612fe3565b9050602002016020810190610e7291906129e8565b6040516001600160a01b03909116815260200160405180910390a1610ebe848483818110610ea257610ea2612fe3565b9050602002016020810190610eb791906129e8565b6000611ad6565b600101610d80565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610f0e5760405162461bcd60e51b815260040161062490612f85565b610bcc84848484611d4c565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610f625760405162461bcd60e51b815260040161062490612f85565b604051636ce5768960e11b81526001600160a01b03858116600483015282811660248301526044820184905284169063d9caed1290606401600060405180830381600087803b158015610fb457600080fd5b505af1158015610fc8573d6000803e3d6000fd5b5050505050505050565b610fda611b44565b61063681611fd9565b60ce6020528160005260406000208181548110610fff57600080fd5b6000918252602090912001546001600160a01b03169150829050565b600054610100900460ff161580801561103b5750600054600160ff909116105b806110555750303b158015611055575060005460ff166001145b6110b85760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610624565b6000805460ff1916600117905580156110db576000805461ff0019166101001790555b6110e3612042565b60c9556110f083836120d9565b6110f985611b9e565b61110284611fd9565b8015611148576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050565b60cb546001600160a01b031633146111795760405162461bcd60e51b815260040161062490612f1b565b8281146112025760405162461bcd60e51b815260206004820152604b60248201527f53747261746567794d616e616765722e61646453747261746567696573546f4460448201527f65706f73697457686974656c6973743a206172726179206c656e67746873206460648201526a0de40dcdee840dac2e8c6d60ab1b608482015260a401610624565b8260005b818110156113705760d1600087878481811061122457611224612fe3565b905060200201602081019061123991906129e8565b6001600160a01b0316815260208101919091526040016000205460ff1661136857600160d1600088888581811061127257611272612fe3565b905060200201602081019061128791906129e8565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790557f0c35b17d91c96eb2751cd456e1252f42a386e524ef9ff26ecc9950859fdc04fe8686838181106112e2576112e2612fe3565b90506020020160208101906112f791906129e8565b6040516001600160a01b03909116815260200160405180910390a161136886868381811061132757611327612fe3565b905060200201602081019061133c91906129e8565b85858481811061134e5761134e612fe3565b90506020020160208101906113639190612ff9565b611ad6565b600101611206565b505050505050565b6098546000908190600190811614156113cf5760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b6044820152606401610624565b600260655414156114225760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610624565b600260655561143333868686611907565b600160655595945050505050565b611449611b44565b6001600160a01b0381166114ae5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610624565b61063681611b9e565b60007f00000000000000000000000000000000000000000000000000000000000000004614156114e8575060c95490565b6114f0612042565b905090565b609760009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611548573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061156c9190612e4f565b6001600160a01b0316336001600160a01b03161461159c5760405162461bcd60e51b815260040161062490612e6c565b60985419811960985419161461161a5760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c69747900000000000000006064820152608401610624565b609881905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200161076d565b6001600160a01b0381166116df5760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a401610624565b609754604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1609780546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0383163b1561186757604051630b135d3f60e11b808252906001600160a01b03851690631626ba7e90611788908690869060040161306e565b602060405180830381865afa1580156117a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117c99190613087565b6001600160e01b031916146118625760405162461bcd60e51b815260206004820152605360248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a2045524331323731207369676e6174757265206064820152721d995c9a599a58d85d1a5bdb8819985a5b1959606a1b608482015260a401610624565b505050565b826001600160a01b031661187b83836121bf565b6001600160a01b0316146118625760405162461bcd60e51b815260206004820152604760248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a207369676e6174757265206e6f742066726f6d6064820152661039b4b3b732b960c91b608482015260a401610624565b6001600160a01b038316600090815260d16020526040812054849060ff166119ad5760405162461bcd60e51b815260206004820152604d60248201527f53747261746567794d616e616765722e6f6e6c7953747261746567696573576860448201527f6974656c6973746564466f724465706f7369743a207374726174656779206e6f60648201526c1d081dda1a5d195b1a5cdd1959609a1b608482015260a401610624565b6119c26001600160a01b0385163387866121e3565b6040516311f9fbc960e21b81526001600160a01b038581166004830152602482018590528616906347e7ef24906044016020604051808303816000875af1158015611a11573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a3591906130b1565b9150611a4386858785611d4c565b604051631452b9d760e11b81526001600160a01b0387811660048301528681166024830152604482018490527f000000000000000000000000000000000000000000000000000000000000000016906328a573ae90606401600060405180830381600087803b158015611ab557600080fd5b505af1158015611ac9573d6000803e3d6000fd5b5050505050949350505050565b604080516001600160a01b038416815282151560208201527f77d930df4937793473a95024d87a98fd2ccb9e92d3c2463b3dacd65d3e6a5786910160405180910390a16001600160a01b0391909116600090815260d360205260409020805460ff1916911515919091179055565b6033546001600160a01b03163314610b775760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610624565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600081611c655760405162461bcd60e51b815260206004820152603e60248201527f53747261746567794d616e616765722e5f72656d6f76655368617265733a207360448201527f68617265416d6f756e742073686f756c64206e6f74206265207a65726f2100006064820152608401610624565b6001600160a01b03808516600090815260cd602090815260408083209387168352929052205480831115611cf75760405162461bcd60e51b815260206004820152603360248201527f53747261746567794d616e616765722e5f72656d6f76655368617265733a20736044820152720d0c2e4ca82dadeeadce840e8dede40d0d2ced606b1b6064820152608401610624565b6001600160a01b03808616600090815260cd602090815260408083209388168352929052208382039081905590831415611d3f57611d35858561223d565b6001915050611d45565b60009150505b9392505050565b6001600160a01b038416611dc85760405162461bcd60e51b815260206004820152603960248201527f53747261746567794d616e616765722e5f6164645368617265733a207374616b60448201527f65722063616e6e6f74206265207a65726f2061646472657373000000000000006064820152608401610624565b80611e345760405162461bcd60e51b815260206004820152603660248201527f53747261746567794d616e616765722e5f6164645368617265733a207368617260448201527565732073686f756c64206e6f74206265207a65726f2160501b6064820152608401610624565b6001600160a01b03808516600090815260cd6020908152604080832093861683529290522054611f45576001600160a01b038416600090815260ce602090815260409091205410611f065760405162461bcd60e51b815260206004820152605060248201527f53747261746567794d616e616765722e5f6164645368617265733a206465706f60448201527f73697420776f756c6420657863656564204d41585f5354414b45525f5354524160648201526f0a88a8eb2be9892a6a8be988a9c8ea8960831b608482015260a401610624565b6001600160a01b03848116600090815260ce602090815260408220805460018101825590835291200180546001600160a01b0319169184169190911790555b6001600160a01b03808516600090815260cd6020908152604080832093861683529290529081208054839290611f7c9084906130e0565b9091555050604080516001600160a01b03868116825285811660208301528416818301526060810183905290517f7cfff908a4b583f36430b25d75964c458d8ede8a99bd61be750e97ee1b2f3a969181900360800190a150505050565b60cb54604080516001600160a01b03928316815291831660208301527f4264275e593955ff9d6146a51a4525f6ddace2e81db9391abcc9d1ca48047d29910160405180910390a160cb80546001600160a01b0319166001600160a01b0392909216919091179055565b604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b6097546001600160a01b03161580156120fa57506001600160a01b03821615155b61217c5760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a401610624565b609881905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2610a9a82611651565b60008060006121ce858561242f565b915091506121db8161249f565b509392505050565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052610bcc90859061265a565b6001600160a01b038216600090815260ce6020526040812054905b81811015612358576001600160a01b03848116600090815260ce602052604090208054918516918390811061228f5761228f612fe3565b6000918252602090912001546001600160a01b03161415612350576001600160a01b038416600090815260ce6020526040902080546122d0906001906130f8565b815481106122e0576122e0612fe3565b60009182526020808320909101546001600160a01b03878116845260ce909252604090922080549190921691908390811061231d5761231d612fe3565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550612358565b600101612258565b818114156123e05760405162461bcd60e51b815260206004820152604960248201527f53747261746567794d616e616765722e5f72656d6f766553747261746567794660448201527f726f6d5374616b657253747261746567794c6973743a207374726174656779206064820152681b9bdd08199bdd5b9960ba1b608482015260a401610624565b6001600160a01b038416600090815260ce602052604090208054806124075761240761310f565b600082815260209020810160001990810180546001600160a01b031916905501905550505050565b6000808251604114156124665760208301516040840151606085015160001a61245a8782858561272c565b94509450505050612498565b8251604014156124905760208301516040840151612485868383612819565b935093505050612498565b506000905060025b9250929050565b60008160048111156124b3576124b3613125565b14156124bc5750565b60018160048111156124d0576124d0613125565b141561251e5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610624565b600281600481111561253257612532613125565b14156125805760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610624565b600381600481111561259457612594613125565b14156125ed5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610624565b600481600481111561260157612601613125565b14156106365760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610624565b60006126af826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166128529092919063ffffffff16565b80519091501561186257808060200190518101906126cd9190612eb6565b6118625760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610624565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156127635750600090506003612810565b8460ff16601b1415801561277b57508460ff16601c14155b1561278c5750600090506004612810565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156127e0573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661280957600060019250925050612810565b9150600090505b94509492505050565b6000806001600160ff1b0383168161283660ff86901c601b6130e0565b90506128448782888561272c565b935093505050935093915050565b60606128618484600085612869565b949350505050565b6060824710156128ca5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610624565b6001600160a01b0385163b6129215760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610624565b600080866001600160a01b0316858760405161293d919061313b565b60006040518083038185875af1925050503d806000811461297a576040519150601f19603f3d011682016040523d82523d6000602084013e61297f565b606091505b509150915061298f82828661299a565b979650505050505050565b606083156129a9575081611d45565b8251156129b95782518084602001fd5b8160405162461bcd60e51b81526004016106249190613157565b6001600160a01b038116811461063657600080fd5b6000602082840312156129fa57600080fd5b8135611d45816129d3565b600060208284031215612a1757600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b60008060008060008060c08789031215612a4d57600080fd5b8635612a58816129d3565b95506020870135612a68816129d3565b9450604087013593506060870135612a7f816129d3565b92506080870135915060a087013567ffffffffffffffff80821115612aa357600080fd5b818901915089601f830112612ab757600080fd5b813581811115612ac957612ac9612a1e565b604051601f8201601f19908116603f01168101908382118183101715612af157612af1612a1e565b816040528281528c6020848701011115612b0a57600080fd5b8260208601602083013760006020848301015280955050505050509295509295509295565b801515811461063657600080fd5b60008060408385031215612b5057600080fd5b8235612b5b816129d3565b91506020830135612b6b81612b2f565b809150509250929050565b600060208284031215612b8857600080fd5b813560ff81168114611d4557600080fd5b60008060408385031215612bac57600080fd5b8235612bb7816129d3565b91506020830135612b6b816129d3565b600080600060608486031215612bdc57600080fd5b8335612be7816129d3565b92506020840135612bf7816129d3565b929592945050506040919091013590565b604080825283519082018190526000906020906060840190828701845b82811015612c4a5781516001600160a01b031684529284019290840190600101612c25565b5050508381038285015284518082528583019183019060005b81811015612c7f57835183529284019291840191600101612c63565b5090979650505050505050565b60008083601f840112612c9e57600080fd5b50813567ffffffffffffffff811115612cb657600080fd5b6020830191508360208260051b850101111561249857600080fd5b60008060208385031215612ce457600080fd5b823567ffffffffffffffff811115612cfb57600080fd5b612d0785828601612c8c565b90969095509350505050565b60008060008060808587031215612d2957600080fd5b8435612d34816129d3565b93506020850135612d44816129d3565b92506040850135612d54816129d3565b9396929550929360600135925050565b60008060008060808587031215612d7a57600080fd5b8435612d85816129d3565b93506020850135612d95816129d3565b9250604085013591506060850135612dac816129d3565b939692955090935050565b60008060408385031215612dca57600080fd5b8235612dd5816129d3565b946020939093013593505050565b60008060008060408587031215612df957600080fd5b843567ffffffffffffffff80821115612e1157600080fd5b612e1d88838901612c8c565b90965094506020870135915080821115612e3657600080fd5b50612e4387828801612c8c565b95989497509550505050565b600060208284031215612e6157600080fd5b8151611d45816129d3565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b600060208284031215612ec857600080fd5b8151611d4581612b2f565b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b60208082526044908201527f53747261746567794d616e616765722e6f6e6c7953747261746567795768697460408201527f656c69737465723a206e6f742074686520737472617465677957686974656c6960608201526339ba32b960e11b608082015260a00190565b602080825260409082018190527f53747261746567794d616e616765722e6f6e6c7944656c65676174696f6e4d61908201527f6e616765723a206e6f74207468652044656c65676174696f6e4d616e61676572606082015260800190565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561300b57600080fd5b8135611d4581612b2f565b60005b83811015613031578181015183820152602001613019565b83811115610bcc5750506000910152565b6000815180845261305a816020860160208601613016565b601f01601f19169290920160200192915050565b8281526040602082015260006128616040830184613042565b60006020828403121561309957600080fd5b81516001600160e01b031981168114611d4557600080fd5b6000602082840312156130c357600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b600082198211156130f3576130f36130ca565b500190565b60008282101561310a5761310a6130ca565b500390565b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052602160045260246000fd5b6000825161314d818460208701613016565b9190910192915050565b602081526000611d45602083018461304256fea2646970667358221220e1eb2321685fb63a9aec2a407059955dbb014f9ba1598fed273d59a1889501d764736f6c634300080c0033", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_delegation\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"},{\"name\":\"_eigenPodManager\",\"type\":\"address\",\"internalType\":\"contractIEigenPodManager\"},{\"name\":\"_slasher\",\"type\":\"address\",\"internalType\":\"contractISlasher\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"DEPOSIT_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"DOMAIN_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"addShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addStrategiesToDepositWhitelist\",\"inputs\":[{\"name\":\"strategiesToWhitelist\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"thirdPartyTransfersForbiddenValues\",\"type\":\"bool[]\",\"internalType\":\"bool[]\"}],\"outputs\":[],\"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\":\"shares\",\"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\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"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\":\"getDeposits\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialStrategyWhitelister\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"initialPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"nonces\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"removeShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeStrategiesFromDepositWhitelist\",\"inputs\":[{\"name\":\"strategiesToRemoveFromWhitelist\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setPauserRegistry\",\"inputs\":[{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setStrategyWhitelister\",\"inputs\":[{\"name\":\"newStrategyWhitelister\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setThirdPartyTransfersForbidden\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"value\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"slasher\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractISlasher\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"stakerStrategyList\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"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\":\"stakerStrategyShares\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"strategyIsWhitelistedForDeposit\",\"inputs\":[{\"name\":\"\",\"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\":\"thirdPartyTransfersForbidden\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawSharesAsTokens\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"Deposit\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIERC20\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PauserRegistrySet\",\"inputs\":[{\"name\":\"pauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"}],\"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\":\"event\",\"name\":\"UpdatedThirdPartyTransfersForbidden\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"value\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"CurrentlyPaused\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputArrayLengthMismatch\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InsufficientShares\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNewPausedStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidSignatureEIP1271\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidSignatureEOA\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxStrategiesExceeded\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyPauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnpauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SharesAmountZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SignatureExpired\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StakerAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyNotFound\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyNotWhitelisted\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ThirdPartyTransfersDisabled\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UnauthorizedCaller\",\"inputs\":[]}]", + Bin: "0x61010060405234801561001157600080fd5b50604051612bcf380380612bcf83398101604081905261003091610135565b6001600160a01b0380841660805280831660a052811660c05261005161005d565b50504660e05250610182565b600054610100900460ff16156100c95760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101561011b576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b038116811461013257600080fd5b50565b60008060006060848603121561014a57600080fd5b83516101558161011d565b60208501519093506101668161011d565b60408501519092506101778161011d565b809150509250925092565b60805160a05160c05160e0516129f86101d760003960006112df0152600061046e0152600061028501526000818161051a01528181610a3901528181610d8801528181610ddd015261169801526129f86000f3fe608060405234801561001057600080fd5b50600436106102065760003560e01c80638da5cb5b1161011a578063c6656702116100ad578063df5cf7231161007c578063df5cf72314610515578063e7a050aa1461053c578063f2fde38b1461054f578063f698da2514610562578063fabc1cbc1461056a57600080fd5b8063c6656702146104c9578063cbc2bd62146104dc578063cf756fdf146104ef578063df5b35471461050257600080fd5b8063b1344271116100e9578063b134427114610469578063b5d8b5b814610490578063c4623ea1146104a3578063c608c7f3146104b657600080fd5b80638da5cb5b1461040157806394f649dd14610412578063967fc0d2146104335780639b4da03d1461044657600080fd5b80635ac86ab71161019d5780637a7e0d921161016c5780637a7e0d92146103675780637ecebe0014610392578063886f1195146103b25780638b8aac3c146103c55780638c80d4e5146103ee57600080fd5b80635ac86ab7146103015780635c975abb14610334578063663c1de41461033c578063715018a61461035f57600080fd5b80634665bcda116101d95780634665bcda1461028057806348825e94146102bf5780634e5a4263146102e6578063595c6a67146102f957600080fd5b806310d67a2f1461020b578063136439dd1461022057806320606b701461023357806332e89ace1461026d575b600080fd5b61021e610219366004612397565b61057d565b005b61021e61022e3660046123b4565b610631565b61025a7f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b6040519081526020015b60405180910390f35b61025a61027b3660046123e3565b61071c565b6102a77f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610264565b61025a7f4337f82d142e41f2a8c10547cd8c859bddb92262a61058e77842e24d9dea922481565b61021e6102f43660046124f4565b610919565b61021e610952565b61032461030f36600461252d565b609854600160ff9092169190911b9081161490565b6040519015158152602001610264565b60985461025a565b61032461034a366004612397565b60d16020526000908152604090205460ff1681565b61021e610a1a565b61025a610375366004612550565b60cd60209081526000928352604080842090915290825290205481565b61025a6103a0366004612397565b60ca6020526000908152604090205481565b6097546102a7906001600160a01b031681565b61025a6103d3366004612397565b6001600160a01b0316600090815260ce602052604090205490565b61021e6103fc36600461257e565b610a2e565b6033546001600160a01b03166102a7565b610425610420366004612397565b610a88565b6040516102649291906125bf565b60cb546102a7906001600160a01b031681565b610324610454366004612397565b60d36020526000908152604090205460ff1681565b6102a77f000000000000000000000000000000000000000000000000000000000000000081565b61021e61049e36600461268f565b610c08565b61021e6104b13660046126d1565b610d7d565b61021e6104c4366004612722565b610dd2565b61021e6104d7366004612397565b610e8b565b6102a76104ea366004612775565b610e9c565b61021e6104fd3660046126d1565b610ed4565b61021e6105103660046127a1565b611008565b6102a77f000000000000000000000000000000000000000000000000000000000000000081565b61025a61054a36600461257e565b6111c9565b61021e61055d366004612397565b611265565b61025a6112db565b61021e6105783660046123b4565b611318565b609760009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156105d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105f49190612812565b6001600160a01b0316336001600160a01b0316146106255760405163794821ff60e01b815260040160405180910390fd5b61062e81611420565b50565b60975460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015610679573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061069d919061282f565b6106ba57604051631d77d47760e21b815260040160405180910390fd5b609854818116146106de5760405163c61dca5d60e01b815260040160405180910390fd5b609881905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b60985460009081906001908116036107475760405163840a48d560e01b815260040160405180910390fd5b60026065540361079e5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064015b60405180910390fd5b60026065556001600160a01b038816600090815260d3602052604090205460ff16156107dd5760405163dc34227160e01b815260040160405180910390fd5b428410156107fe57604051630819bdcd60e01b815260040160405180910390fd5b6001600160a01b03858116600081815260ca602090815260408083205481517f4337f82d142e41f2a8c10547cd8c859bddb92262a61058e77842e24d9dea922493810193909352908201939093528b84166060820152928a16608084015260a0830189905260c0830182905260e0830187905290916101000160408051601f1981840301815291815281516020928301206001600160a01b038a16600090815260ca90935290822060018501905591506108b66112db565b60405161190160f01b60208201526022810191909152604281018390526062016040516020818303038152906040528051906020012090506108f98882886114b0565b610905888c8c8c611599565b60016065559b9a5050505050505050505050565b60cb546001600160a01b0316331461094457604051635c427cd960e01b815260040160405180910390fd5b61094e82826116fd565b5050565b60975460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa15801561099a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109be919061282f565b6109db57604051631d77d47760e21b815260040160405180910390fd5b600019609881905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b610a2261176b565b610a2c60006117c5565b565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610a7757604051635c427cd960e01b815260040160405180910390fd5b610a82838383611817565b50505050565b6001600160a01b038116600090815260ce60205260408120546060918291908167ffffffffffffffff811115610ac057610ac06123cd565b604051908082528060200260200182016040528015610ae9578160200160208202803683370190505b50905060005b82811015610b7a576001600160a01b038616600090815260cd6020908152604080832060ce9092528220805491929184908110610b2e57610b2e61284c565b60009182526020808320909101546001600160a01b031683528201929092526040019020548251839083908110610b6757610b6761284c565b6020908102919091010152600101610aef565b5060ce6000866001600160a01b03166001600160a01b031681526020019081526020016000208181805480602002602001604051908101604052809291908181526020018280548015610bf657602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610bd8575b50505050509150935093505050915091565b60cb546001600160a01b03163314610c3357604051635c427cd960e01b815260040160405180910390fd5b8060005b81811015610a825760d16000858584818110610c5557610c5561284c565b9050602002016020810190610c6a9190612397565b6001600160a01b0316815260208101919091526040016000205460ff1615610d7557600060d16000868685818110610ca457610ca461284c565b9050602002016020810190610cb99190612397565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790557f4074413b4b443e4e58019f2855a8765113358c7c72e39509c6af45fc0f5ba030848483818110610d1457610d1461284c565b9050602002016020810190610d299190612397565b6040516001600160a01b03909116815260200160405180910390a1610d75848483818110610d5957610d5961284c565b9050602002016020810190610d6e9190612397565b60006116fd565b600101610c37565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610dc657604051635c427cd960e01b815260040160405180910390fd5b610a82848484846118d8565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610e1b57604051635c427cd960e01b815260040160405180910390fd5b604051636ce5768960e11b81526001600160a01b03858116600483015282811660248301526044820184905284169063d9caed1290606401600060405180830381600087803b158015610e6d57600080fd5b505af1158015610e81573d6000803e3d6000fd5b5050505050505050565b610e9361176b565b61062e81611a5b565b60ce6020528160005260406000208181548110610eb857600080fd5b6000918252602090912001546001600160a01b03169150829050565b600054610100900460ff1615808015610ef45750600054600160ff909116105b80610f0e5750303b158015610f0e575060005460ff166001145b610f715760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610795565b6000805460ff191660011790558015610f94576000805461ff0019166101001790555b610f9c611ac4565b60c955610fa98383611b5b565b610fb2856117c5565b610fbb84611a5b565b8015611001576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050565b60cb546001600160a01b0316331461103357604051635c427cd960e01b815260040160405180910390fd5b828114611053576040516343714afd60e01b815260040160405180910390fd5b8260005b818110156111c15760d160008787848181106110755761107561284c565b905060200201602081019061108a9190612397565b6001600160a01b0316815260208101919091526040016000205460ff166111b957600160d160008888858181106110c3576110c361284c565b90506020020160208101906110d89190612397565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790557f0c35b17d91c96eb2751cd456e1252f42a386e524ef9ff26ecc9950859fdc04fe8686838181106111335761113361284c565b90506020020160208101906111489190612397565b6040516001600160a01b03909116815260200160405180910390a16111b98686838181106111785761117861284c565b905060200201602081019061118d9190612397565b85858481811061119f5761119f61284c565b90506020020160208101906111b49190612862565b6116fd565b600101611057565b505050505050565b60985460009081906001908116036111f45760405163840a48d560e01b815260040160405180910390fd5b6002606554036112465760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610795565b600260655561125733868686611599565b600160655595945050505050565b61126d61176b565b6001600160a01b0381166112d25760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610795565b61062e816117c5565b60007f0000000000000000000000000000000000000000000000000000000000000000460361130b575060c95490565b611313611ac4565b905090565b609760009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561136b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061138f9190612812565b6001600160a01b0316336001600160a01b0316146113c05760405163794821ff60e01b815260040160405180910390fd5b6098541981196098541916146113e95760405163c61dca5d60e01b815260040160405180910390fd5b609881905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c90602001610711565b6001600160a01b038116611447576040516339b190bb60e11b815260040160405180910390fd5b609754604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1609780546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0383163b1561155e57604051630b135d3f60e11b808252906001600160a01b03851690631626ba7e906114f090869086906004016128cf565b602060405180830381865afa15801561150d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061153191906128e8565b6001600160e01b031916146115595760405163026aa43360e31b815260040160405180910390fd5b505050565b826001600160a01b03166115728383611bdc565b6001600160a01b031614611559576040516306c653c360e31b815260040160405180910390fd5b6001600160a01b038316600090815260d16020526040812054849060ff166115d457604051632efd965160e11b815260040160405180910390fd5b6115e96001600160a01b038516338786611c02565b6040516311f9fbc960e21b81526001600160a01b038581166004830152602482018590528616906347e7ef24906044016020604051808303816000875af1158015611638573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061165c9190612912565b915061166a868587856118d8565b604051631452b9d760e11b81526001600160a01b0387811660048301528681166024830152604482018490527f000000000000000000000000000000000000000000000000000000000000000016906328a573ae90606401600060405180830381600087803b1580156116dc57600080fd5b505af11580156116f0573d6000803e3d6000fd5b5050505050949350505050565b604080516001600160a01b038416815282151560208201527f77d930df4937793473a95024d87a98fd2ccb9e92d3c2463b3dacd65d3e6a5786910160405180910390a16001600160a01b0391909116600090815260d360205260409020805460ff1916911515919091179055565b6033546001600160a01b03163314610a2c5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610795565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60008160000361183a576040516342061b2560e11b815260040160405180910390fd5b6001600160a01b03808516600090815260cd60209081526040808320938716835292905220548083111561188157604051633999656760e01b815260040160405180910390fd5b6001600160a01b03808616600090815260cd60209081526040808320938816835292905290812091849003918290558190036118cb576118c18585611c5c565b60019150506118d1565b60009150505b9392505050565b6001600160a01b0384166118ff576040516316f2ccc960e01b815260040160405180910390fd5b80600003611920576040516342061b2560e11b815260040160405180910390fd5b6001600160a01b03808516600090815260cd6020908152604080832093861683529290529081205490036119c7576001600160a01b038416600090815260ce602090815260409091205410611988576040516301a1443960e31b815260040160405180910390fd5b6001600160a01b03848116600090815260ce602090815260408220805460018101825590835291200180546001600160a01b0319169184169190911790555b6001600160a01b03808516600090815260cd60209081526040808320938616835292905290812080548392906119fe908490612941565b9091555050604080516001600160a01b03868116825285811660208301528416818301526060810183905290517f7cfff908a4b583f36430b25d75964c458d8ede8a99bd61be750e97ee1b2f3a969181900360800190a150505050565b60cb54604080516001600160a01b03928316815291831660208301527f4264275e593955ff9d6146a51a4525f6ddace2e81db9391abcc9d1ca48047d29910160405180910390a160cb80546001600160a01b0319166001600160a01b0392909216919091179055565b604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b6097546001600160a01b0316158015611b7c57506001600160a01b03821615155b611b99576040516339b190bb60e11b815260040160405180910390fd5b609881905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a261094e82611420565b6000806000611beb8585611de5565b91509150611bf881611e53565b5090505b92915050565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052610a82908590612009565b6001600160a01b038216600090815260ce6020526040812054905b81811015611d76576001600160a01b03848116600090815260ce6020526040902080549185169183908110611cae57611cae61284c565b6000918252602090912001546001600160a01b031603611d6e576001600160a01b038416600090815260ce602052604090208054611cee90600190612954565b81548110611cfe57611cfe61284c565b60009182526020808320909101546001600160a01b03878116845260ce9092526040909220805491909216919083908110611d3b57611d3b61284c565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550611d76565b600101611c77565b818103611d9657604051632df15a4160e11b815260040160405180910390fd5b6001600160a01b038416600090815260ce60205260409020805480611dbd57611dbd612967565b600082815260209020810160001990810180546001600160a01b031916905501905550505050565b6000808251604103611e1b5760208301516040840151606085015160001a611e0f878285856120db565b94509450505050611e4c565b8251604003611e445760208301516040840151611e398683836121c8565b935093505050611e4c565b506000905060025b9250929050565b6000816004811115611e6757611e6761297d565b03611e6f5750565b6001816004811115611e8357611e8361297d565b03611ed05760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610795565b6002816004811115611ee457611ee461297d565b03611f315760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610795565b6003816004811115611f4557611f4561297d565b03611f9d5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610795565b6004816004811115611fb157611fb161297d565b0361062e5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610795565b600061205e826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166122019092919063ffffffff16565b805190915015611559578080602001905181019061207c919061282f565b6115595760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610795565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561211257506000905060036121bf565b8460ff16601b1415801561212a57508460ff16601c14155b1561213b57506000905060046121bf565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa15801561218f573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166121b8576000600192509250506121bf565b9150600090505b94509492505050565b6000806001600160ff1b038316816121e560ff86901c601b612941565b90506121f3878288856120db565b935093505050935093915050565b60606122108484600085612218565b949350505050565b6060824710156122795760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610795565b6001600160a01b0385163b6122d05760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610795565b600080866001600160a01b031685876040516122ec9190612993565b60006040518083038185875af1925050503d8060008114612329576040519150601f19603f3d011682016040523d82523d6000602084013e61232e565b606091505b509150915061233e828286612349565b979650505050505050565b606083156123585750816118d1565b8251156123685782518084602001fd5b8160405162461bcd60e51b815260040161079591906129af565b6001600160a01b038116811461062e57600080fd5b6000602082840312156123a957600080fd5b81356118d181612382565b6000602082840312156123c657600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b60008060008060008060c087890312156123fc57600080fd5b863561240781612382565b9550602087013561241781612382565b945060408701359350606087013561242e81612382565b92506080870135915060a087013567ffffffffffffffff81111561245157600080fd5b8701601f8101891361246257600080fd5b803567ffffffffffffffff81111561247c5761247c6123cd565b604051601f8201601f19908116603f0116810167ffffffffffffffff811182821017156124ab576124ab6123cd565b6040528181528282016020018b10156124c357600080fd5b816020840160208301376000602083830101528093505050509295509295509295565b801515811461062e57600080fd5b6000806040838503121561250757600080fd5b823561251281612382565b91506020830135612522816124e6565b809150509250929050565b60006020828403121561253f57600080fd5b813560ff811681146118d157600080fd5b6000806040838503121561256357600080fd5b823561256e81612382565b9150602083013561252281612382565b60008060006060848603121561259357600080fd5b833561259e81612382565b925060208401356125ae81612382565b929592945050506040919091013590565b6040808252835190820181905260009060208501906060840190835b818110156126025783516001600160a01b03168352602093840193909201916001016125db565b50508381036020808601919091528551808352918101925085019060005b8181101561263e578251845260209384019390920191600101612620565b50919695505050505050565b60008083601f84011261265c57600080fd5b50813567ffffffffffffffff81111561267457600080fd5b6020830191508360208260051b8501011115611e4c57600080fd5b600080602083850312156126a257600080fd5b823567ffffffffffffffff8111156126b957600080fd5b6126c58582860161264a565b90969095509350505050565b600080600080608085870312156126e757600080fd5b84356126f281612382565b9350602085013561270281612382565b9250604085013561271281612382565b9396929550929360600135925050565b6000806000806080858703121561273857600080fd5b843561274381612382565b9350602085013561275381612382565b925060408501359150606085013561276a81612382565b939692955090935050565b6000806040838503121561278857600080fd5b823561279381612382565b946020939093013593505050565b600080600080604085870312156127b757600080fd5b843567ffffffffffffffff8111156127ce57600080fd5b6127da8782880161264a565b909550935050602085013567ffffffffffffffff8111156127fa57600080fd5b6128068782880161264a565b95989497509550505050565b60006020828403121561282457600080fd5b81516118d181612382565b60006020828403121561284157600080fd5b81516118d1816124e6565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561287457600080fd5b81356118d1816124e6565b60005b8381101561289a578181015183820152602001612882565b50506000910152565b600081518084526128bb81602086016020860161287f565b601f01601f19169290920160200192915050565b82815260406020820152600061221060408301846128a3565b6000602082840312156128fa57600080fd5b81516001600160e01b0319811681146118d157600080fd5b60006020828403121561292457600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b80820180821115611bfc57611bfc61292b565b81810381811115611bfc57611bfc61292b565b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052602160045260246000fd5b600082516129a581846020870161287f565b9190910192915050565b6020815260006118d160208301846128a356fea264697066735822122009690e25d03334cb4e30699b14b936c3d5a2bd7cb26a95c277eca29b84a6ba8164736f6c634300081b0033", } // StrategyManagerABI is the input ABI used to generate the binding from. diff --git a/pkg/bindings/StrategyManagerStorage/binding.go b/pkg/bindings/StrategyManagerStorage/binding.go index 3dc3ddcac..4e9b56d9b 100644 --- a/pkg/bindings/StrategyManagerStorage/binding.go +++ b/pkg/bindings/StrategyManagerStorage/binding.go @@ -31,7 +31,7 @@ var ( // StrategyManagerStorageMetaData contains all meta data concerning the StrategyManagerStorage contract. var StrategyManagerStorageMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"function\",\"name\":\"DEPOSIT_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"DOMAIN_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"addShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addStrategiesToDepositWhitelist\",\"inputs\":[{\"name\":\"strategiesToWhitelist\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"thirdPartyTransfersForbiddenValues\",\"type\":\"bool[]\",\"internalType\":\"bool[]\"}],\"outputs\":[],\"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\":\"shares\",\"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\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"eigenPodManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigenPodManager\"}],\"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\":\"nonces\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"removeShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeStrategiesFromDepositWhitelist\",\"inputs\":[{\"name\":\"strategiesToRemoveFromWhitelist\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setThirdPartyTransfersForbidden\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"value\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"slasher\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractISlasher\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"stakerStrategyList\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"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\":\"stakerStrategyShares\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"strategyIsWhitelistedForDeposit\",\"inputs\":[{\"name\":\"\",\"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\":\"thirdPartyTransfersForbidden\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"withdrawSharesAsTokens\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"Deposit\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIERC20\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyAddedToDepositWhitelist\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyRemovedFromDepositWhitelist\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyWhitelisterChanged\",\"inputs\":[{\"name\":\"previousAddress\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newAddress\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"UpdatedThirdPartyTransfersForbidden\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"value\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false}]", + ABI: "[{\"type\":\"function\",\"name\":\"DEPOSIT_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"DOMAIN_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"addShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addStrategiesToDepositWhitelist\",\"inputs\":[{\"name\":\"strategiesToWhitelist\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"thirdPartyTransfersForbiddenValues\",\"type\":\"bool[]\",\"internalType\":\"bool[]\"}],\"outputs\":[],\"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\":\"shares\",\"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\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"eigenPodManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigenPodManager\"}],\"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\":\"nonces\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"removeShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeStrategiesFromDepositWhitelist\",\"inputs\":[{\"name\":\"strategiesToRemoveFromWhitelist\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setThirdPartyTransfersForbidden\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"value\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"slasher\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractISlasher\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"stakerStrategyList\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"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\":\"stakerStrategyShares\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"strategyIsWhitelistedForDeposit\",\"inputs\":[{\"name\":\"\",\"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\":\"thirdPartyTransfersForbidden\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"withdrawSharesAsTokens\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"Deposit\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIERC20\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyAddedToDepositWhitelist\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyRemovedFromDepositWhitelist\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyWhitelisterChanged\",\"inputs\":[{\"name\":\"previousAddress\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newAddress\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"UpdatedThirdPartyTransfersForbidden\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"value\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"InputArrayLengthMismatch\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InsufficientShares\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxStrategiesExceeded\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SharesAmountZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SignatureExpired\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StakerAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyNotFound\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyNotWhitelisted\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ThirdPartyTransfersDisabled\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UnauthorizedCaller\",\"inputs\":[]}]", } // StrategyManagerStorageABI is the input ABI used to generate the binding from. diff --git a/pkg/bindings/StructuredLinkedList/binding.go b/pkg/bindings/StructuredLinkedList/binding.go index b291ef98d..13660369d 100644 --- a/pkg/bindings/StructuredLinkedList/binding.go +++ b/pkg/bindings/StructuredLinkedList/binding.go @@ -32,7 +32,7 @@ var ( // StructuredLinkedListMetaData contains all meta data concerning the StructuredLinkedList contract. var StructuredLinkedListMetaData = &bind.MetaData{ ABI: "[]", - Bin: "0x60566037600b82828239805160001a607314602a57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea26469706673582212200b0f3aa07997f25ddb2b0dd17a1b6104304d811d2cec7f2d2dfcae3e3d618f6964736f6c634300080c0033", + Bin: "0x60566037600b82828239805160001a607314602a57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea264697066735822122092539f140d3d409a503af099673213edeec0c3c7d33ea5f70caabce0a5a2076464736f6c634300081b0033", } // StructuredLinkedListABI is the input ABI used to generate the binding from. diff --git a/script/admin/mainnet/Mainnet_Unpause_Deposits.s.sol b/script/admin/mainnet/Mainnet_Unpause_Deposits.s.sol index 8384613db..251670be1 100644 --- a/script/admin/mainnet/Mainnet_Unpause_Deposits.s.sol +++ b/script/admin/mainnet/Mainnet_Unpause_Deposits.s.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.12; +pragma solidity ^0.8.27; import "../../utils/ExistingDeploymentParser.sol"; import "../../utils/TimelockEncoding.sol"; diff --git a/script/configs/devnet/deploy_from_scratch.anvil.config.json b/script/configs/devnet/deploy_from_scratch.anvil.config.json new file mode 100644 index 000000000..5ff29f74c --- /dev/null +++ b/script/configs/devnet/deploy_from_scratch.anvil.config.json @@ -0,0 +1,66 @@ +{ + "maintainer": "samlaf@eigenlabs.org", + "lastUpdated": "todo", + "chainInfo": { + "chainId": 31337 + }, + "multisig_addresses": { + "operationsMultisig": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "communityMultisig": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "pauserMultisig": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "executorMultisig": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "timelock": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266" + }, + "strategies": { + "numStrategies": 0, + "MAX_PER_DEPOSIT": 115792089237316195423570985008687907853269984665640564039457584007913129639935, + "MAX_TOTAL_DEPOSITS": 115792089237316195423570985008687907853269984665640564039457584007913129639935, + "strategiesToDeploy": [] + }, + "strategyManager": { + "init_paused_status": 0, + "init_withdrawal_delay_blocks": 1, + "init_strategy_whitelister": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266" + }, + "eigenPod": { + "PARTIAL_WITHDRAWAL_FRAUD_PROOF_PERIOD_BLOCKS": 1, + "MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR": "32000000000", + "GENESIS_TIME": 0 + }, + "eigenPodManager": { + "init_paused_status": 30 + }, + "delayedWithdrawalRouter": { + "init_paused_status": 0, + "init_withdrawal_delay_blocks": 1 + }, + "slasher": { + "init_paused_status": 0 + }, + "delegationManager": { + "init_minWithdrawalDelayBlocks": 1, + "init_paused_status": 0, + "init_withdrawal_delay_blocks": 1 + }, + "avsDirectory": { + "init_paused_status": 0 + }, + "allocationManager": { + "init_paused_status": 0 + }, + "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" +} diff --git a/script/configs/devnet/deploy_from_scratch.holesky.config.json b/script/configs/devnet/deploy_from_scratch.holesky.config.json new file mode 100644 index 000000000..eedfec93c --- /dev/null +++ b/script/configs/devnet/deploy_from_scratch.holesky.config.json @@ -0,0 +1,66 @@ +{ + "maintainer": "samlaf@eigenlabs.org", + "lastUpdated": "todo", + "chainInfo": { + "chainId": 17000 + }, + "multisig_addresses": { + "operationsMultisig": "0x1981d656d61D6be37f50fD78f6Fd7627Fd2ae597", + "communityMultisig": "0x1981d656d61D6be37f50fD78f6Fd7627Fd2ae597", + "pauserMultisig": "0x1981d656d61D6be37f50fD78f6Fd7627Fd2ae597", + "executorMultisig": "0x1981d656d61D6be37f50fD78f6Fd7627Fd2ae597", + "timelock": "0x1981d656d61D6be37f50fD78f6Fd7627Fd2ae597" + }, + "strategies": { + "numStrategies": 0, + "MAX_PER_DEPOSIT": 115792089237316195423570985008687907853269984665640564039457584007913129639935, + "MAX_TOTAL_DEPOSITS": 115792089237316195423570985008687907853269984665640564039457584007913129639935, + "strategiesToDeploy": [] + }, + "strategyManager": { + "init_paused_status": 0, + "init_withdrawal_delay_blocks": 1, + "init_strategy_whitelister": "0x1981d656d61D6be37f50fD78f6Fd7627Fd2ae597" + }, + "eigenPod": { + "PARTIAL_WITHDRAWAL_FRAUD_PROOF_PERIOD_BLOCKS": 1, + "MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR": "32000000000", + "GENESIS_TIME": 0 + }, + "eigenPodManager": { + "init_paused_status": 30 + }, + "delayedWithdrawalRouter": { + "init_paused_status": 0, + "init_withdrawal_delay_blocks": 1 + }, + "slasher": { + "init_paused_status": 0 + }, + "delegationManager": { + "init_minWithdrawalDelayBlocks": 1, + "init_paused_status": 0, + "init_withdrawal_delay_blocks": 1 + }, + "avsDirectory": { + "init_paused_status": 0 + }, + "allocationManager": { + "init_paused_status": 0 + }, + "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": "0x1981d656d61D6be37f50fD78f6Fd7627Fd2ae597", + "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" +} \ No newline at end of file diff --git a/script/configs/holesky/Deploy_RewardsCoordinator.holesky.config.json b/script/configs/holesky/Deploy_RewardsCoordinator.holesky.config.json new file mode 100644 index 000000000..ecd86e029 --- /dev/null +++ b/script/configs/holesky/Deploy_RewardsCoordinator.holesky.config.json @@ -0,0 +1,60 @@ +{ + "chainInfo": { + "chainId": 17000 + }, + "multisig_addresses": { + "pauserMultisig": "0x53410249ec7d3a3F9F1ba3912D50D6A3Df6d10A7", + "communityMultisig": "0xCb8d2f9e55Bc7B1FA9d089f9aC80C583D2BDD5F7", + "operationsMultisig": "0xfaEF7338b7490b9E272d80A1a39f4657cAf2b97d", + "executorMultisig": "0x28Ade60640fdBDb2609D8d8734D1b5cBeFc0C348", + "timelock": "0xcF19CE0561052a7A7Ff21156730285997B350A7D" + }, + "strategies": { + "numStrategies": 0, + "MAX_PER_DEPOSIT": 115792089237316195423570985008687907853269984665640564039457584007913129639935, + "MAX_TOTAL_DEPOSITS": 115792089237316195423570985008687907853269984665640564039457584007913129639935, + "strategiesToDeploy": [] + }, + "strategyManager": { + "init_strategy_whitelister": "0x28Ade60640fdBDb2609D8d8734D1b5cBeFc0C348", + "init_paused_status": 0 + }, + "delegationManager": { + "init_paused_status": 0, + "init_minWithdrawalDelayBlocks": 10 + }, + "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 + }, + "avsDirectory": { + "init_paused_status": 0 + }, + "slasher": { + "init_paused_status": 0 + }, + "eigenPod": { + "MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR": 32000000000, + "GENESIS_TIME": 1695902400 + }, + "eigenPodManager": { + "init_paused_status": 0, + "deneb_fork_timestamp": "1707305664" + }, + "delayedWithdrawalRouter": { + "init_paused_status": 0, + "init_withdrawalDelayBlocks": 10 + }, + "ethPOSDepositAddress": "0x4242424242424242424242424242424242424242", + "beaconOracleAddress": "0x4C116BB629bff7A8373c2378bBd919f8349B8f25" +} \ No newline at end of file diff --git a/script/configs/local/deploy_from_scratch.anvil.config.json b/script/configs/local/deploy_from_scratch.anvil.config.json index 96df127e1..ead0a948c 100644 --- a/script/configs/local/deploy_from_scratch.anvil.config.json +++ b/script/configs/local/deploy_from_scratch.anvil.config.json @@ -51,5 +51,10 @@ "OPERATOR_SET_GENESIS_REWARDS_TIMESTAMP": 1720656000, "OPERATOR_SET_MAX_RETROACTIVE_LENGTH": 2592000 }, + "allocationManager": { + "init_paused_status": 0, + "DEALLOCATION_DELAY": 900, + "ALLOCATION_DELAY_CONFIGURATION_DELAY": 1200 + }, "ethPOSDepositAddress": "0x00000000219ab540356cBB839Cbe05303d7705Fa" } \ No newline at end of file diff --git a/script/deploy/devnet/Deploy_From_Scratch.s.sol b/script/deploy/devnet/Deploy_From_Scratch.s.sol new file mode 100644 index 000000000..399ef8645 --- /dev/null +++ b/script/deploy/devnet/Deploy_From_Scratch.s.sol @@ -0,0 +1,208 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.12; + +import "../../utils/ExistingDeploymentParser.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)" -- deploy_from_scratch.anvil.config.json +contract DeployFromScratch is ExistingDeploymentParser { + function run(string memory configFilename, string memory outputFilename) external virtual { + _parseInitialDeploymentParams(configFilename); + + // START RECORDING TRANSACTIONS FOR DEPLOYMENT + vm.startBroadcast(); + + emit log_named_address("Deployer Address", msg.sender); + + _deployFromScratch(); + + // STOP RECORDING TRANSACTIONS FOR DEPLOYMENT + vm.stopBroadcast(); + + // Sanity Checks + // _verifyContractPointers(); + // _verifyImplementations(); + // _verifyContractsInitialized(); + // _verifyInitializationParams(); + + logAndOutputContractAddresses(outputFilename); + } + + /** + * @notice Deploy EigenLayer contracts from scratch for Holesky + */ + function _deployFromScratch() internal { + // Deploy ProxyAdmin, later set admins for all proxies to be executorMultisig + eigenLayerProxyAdmin = new ProxyAdmin(); + + // Set multisigs as pausers, executorMultisig as unpauser + address[] memory pausers = new address[](3); + pausers[0] = executorMultisig; + pausers[1] = operationsMultisig; + pausers[2] = pauserMultisig; + address unpauser = executorMultisig; + eigenLayerPauserReg = new PauserRegistry(pausers, unpauser); + + /** + * 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. + */ + emptyContract = new EmptyContract(); + avsDirectory = AVSDirectory( + address(new TransparentUpgradeableProxy(address(emptyContract), address(eigenLayerProxyAdmin), "")) + ); + delegationManager = DelegationManager( + address(new TransparentUpgradeableProxy(address(emptyContract), address(eigenLayerProxyAdmin), "")) + ); + strategyManager = StrategyManager( + address(new TransparentUpgradeableProxy(address(emptyContract), address(eigenLayerProxyAdmin), "")) + ); + slasher = Slasher( + address(new TransparentUpgradeableProxy(address(emptyContract), address(eigenLayerProxyAdmin), "")) + ); + eigenPodManager = EigenPodManager( + address(new TransparentUpgradeableProxy(address(emptyContract), address(eigenLayerProxyAdmin), "")) + ); + allocationManager = AllocationManager( + address(new TransparentUpgradeableProxy(address(emptyContract), address(eigenLayerProxyAdmin), "")) + ); + + // Deploy EigenPod Contracts + eigenPodImplementation = new EigenPod( + IETHPOSDeposit(ETHPOSDepositAddress), + eigenPodManager, + EIGENPOD_GENESIS_TIME + ); + + eigenPodBeacon = new UpgradeableBeacon(address(eigenPodImplementation)); + avsDirectoryImplementation = new AVSDirectory(delegationManager); + delegationManagerImplementation = new DelegationManager(strategyManager, slasher, eigenPodManager, avsDirectory, allocationManager, MIN_WITHDRAWAL_DELAY); + strategyManagerImplementation = new StrategyManager(delegationManager, eigenPodManager, slasher, avsDirectory); + slasherImplementation = new Slasher(strategyManager, delegationManager); + eigenPodManagerImplementation = new EigenPodManager( + IETHPOSDeposit(ETHPOSDepositAddress), + eigenPodBeacon, + strategyManager, + slasher, + delegationManager + ); + allocationManagerImplementation = new AllocationManager(delegationManager, avsDirectory, DEALLOCATION_DELAY, ALLOCATION_DELAY_CONFIGURATION_DELAY); + + // Third, upgrade the proxy contracts to point to the implementations + IStrategy[] memory initializeStrategiesToSetDelayBlocks = new IStrategy[](0); + uint256[] memory initializeWithdrawalDelayBlocks = new uint256[](0); + // AVSDirectory + eigenLayerProxyAdmin.upgradeAndCall( + TransparentUpgradeableProxy(payable(address(avsDirectory))), + address(avsDirectoryImplementation), + abi.encodeWithSelector( + AVSDirectory.initialize.selector, + executorMultisig, // initialOwner + eigenLayerPauserReg, + AVS_DIRECTORY_INIT_PAUSED_STATUS + ) + ); + // DelegationManager + eigenLayerProxyAdmin.upgradeAndCall( + TransparentUpgradeableProxy(payable(address(delegationManager))), + address(delegationManagerImplementation), + abi.encodeWithSelector( + DelegationManager.initialize.selector, + executorMultisig, // initialOwner + eigenLayerPauserReg, + DELEGATION_MANAGER_INIT_PAUSED_STATUS, + DELEGATION_MANAGER_MIN_WITHDRAWAL_DELAY_BLOCKS, + initializeStrategiesToSetDelayBlocks, + initializeWithdrawalDelayBlocks + ) + ); + // StrategyManager + eigenLayerProxyAdmin.upgradeAndCall( + TransparentUpgradeableProxy(payable(address(strategyManager))), + address(strategyManagerImplementation), + abi.encodeWithSelector( + StrategyManager.initialize.selector, + msg.sender, //initialOwner, set to executorMultisig later after whitelisting strategies + msg.sender, //initial whitelister, set to STRATEGY_MANAGER_WHITELISTER later + eigenLayerPauserReg, + STRATEGY_MANAGER_INIT_PAUSED_STATUS + ) + ); + // Slasher + eigenLayerProxyAdmin.upgradeAndCall( + TransparentUpgradeableProxy(payable(address(slasher))), + address(slasherImplementation), + abi.encodeWithSelector( + Slasher.initialize.selector, + executorMultisig, + eigenLayerPauserReg, + SLASHER_INIT_PAUSED_STATUS + ) + ); + // EigenPodManager + eigenLayerProxyAdmin.upgradeAndCall( + TransparentUpgradeableProxy(payable(address(eigenPodManager))), + address(eigenPodManagerImplementation), + abi.encodeWithSelector( + EigenPodManager.initialize.selector, + msg.sender, // initialOwner is msg.sender for now to set forktimestamp later + eigenLayerPauserReg, + EIGENPOD_MANAGER_INIT_PAUSED_STATUS + ) + ); + // AllocationManager + eigenLayerProxyAdmin.upgradeAndCall( + TransparentUpgradeableProxy(payable(address(allocationManager))), + address(allocationManagerImplementation), + abi.encodeWithSelector( + AllocationManager.initialize.selector, + msg.sender, // initialOwner is msg.sender for now to set forktimestamp later + eigenLayerPauserReg, + ALLOCATION_MANAGER_INIT_PAUSED_STATUS + ) + ); + + // Deploy Strategies + baseStrategyImplementation = new StrategyBaseTVLLimits(strategyManager); + uint256 numStrategiesToDeploy = strategiesToDeploy.length; + // whitelist params + IStrategy[] memory strategiesToWhitelist = new IStrategy[](numStrategiesToDeploy); + + for (uint256 i = 0; i < numStrategiesToDeploy; i++) { + StrategyUnderlyingTokenConfig memory strategyConfig = strategiesToDeploy[i]; + + // Deploy and upgrade strategy + StrategyBaseTVLLimits strategy = StrategyBaseTVLLimits( + address(new TransparentUpgradeableProxy(address(emptyContract), address(eigenLayerProxyAdmin), "")) + ); + eigenLayerProxyAdmin.upgradeAndCall( + TransparentUpgradeableProxy(payable(address(strategy))), + address(baseStrategyImplementation), + abi.encodeWithSelector( + StrategyBaseTVLLimits.initialize.selector, + STRATEGY_MAX_PER_DEPOSIT, + STRATEGY_MAX_TOTAL_DEPOSITS, + IERC20(strategyConfig.tokenAddress), + eigenLayerPauserReg + ) + ); + + strategiesToWhitelist[i] = strategy; + + deployedStrategyArray.push(strategy); + } + + // Add strategies to whitelist and set whitelister to STRATEGY_MANAGER_WHITELISTER + strategyManager.addStrategiesToDepositWhitelist(strategiesToWhitelist); + strategyManager.setStrategyWhitelister(STRATEGY_MANAGER_WHITELISTER); + + // Transfer ownership + strategyManager.transferOwnership(executorMultisig); + eigenLayerProxyAdmin.transferOwnership(executorMultisig); + eigenPodManager.transferOwnership(executorMultisig); + eigenPodBeacon.transferOwnership(executorMultisig); + } +} diff --git a/script/deploy/devnet/Upgrade.s.sol b/script/deploy/devnet/Upgrade.s.sol new file mode 100644 index 000000000..8127d4420 --- /dev/null +++ b/script/deploy/devnet/Upgrade.s.sol @@ -0,0 +1,24 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.27; + +import "@openzeppelin/contracts/token/ERC20/presets/ERC20PresetFixedSupply.sol"; +import "../../utils/ExistingDeploymentParser.sol"; + +// # To load the variables in the .env file +// source .env + +// Generic upgrade script, DOES NOT UPDATE IMPLEMENTATION IN OUTPUT FILE +// forge script script/deploy/devnet/Upgrade.s.sol --rpc-url $RPC_URL --private-key $PRIVATE_KEY +contract Upgrade is ExistingDeploymentParser { + + function run() external { + // EDIT this for your script + _parseDeployedContracts("script/output/holesky/pre_preprod_slashing.holesky.json"); + + vm.startBroadcast(); + AVSDirectory newAVSDirectoryImplementation = new AVSDirectory(delegationManager); + eigenLayerProxyAdmin.upgrade(TransparentUpgradeableProxy(payable(address(avsDirectory))), address(newAVSDirectoryImplementation)); + vm.stopBroadcast(); + + } +} \ No newline at end of file diff --git a/script/deploy/devnet/operatorSets/DeployStrategies.s.sol b/script/deploy/devnet/operatorSets/DeployStrategies.s.sol new file mode 100644 index 000000000..d97bd3fe4 --- /dev/null +++ b/script/deploy/devnet/operatorSets/DeployStrategies.s.sol @@ -0,0 +1,81 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.12; + +import "@openzeppelin/contracts/token/ERC20/presets/ERC20PresetFixedSupply.sol"; +import "../../../utils/ExistingDeploymentParser.sol"; + +// # To load the variables in the .env file +// source .env + +// # To deploy and verify our contract +contract DeployStrategies is ExistingDeploymentParser { + + function run(string memory outputFile) external { + _parseDeployedContracts(outputFile); + + emit log_named_address("baseStrategyImplementation", address(baseStrategyImplementation)); + + vm.startBroadcast(); + StrategyDeployer strategyDeployer = new StrategyDeployer( + executorMultisig, + address(baseStrategyImplementation) + ); + uint256 batches = 3; + uint256 batchSize = 10; + + IStrategy[] memory strategies = new IStrategy[](batchSize * batches); + + for (uint256 i = 0; i < batches; i++) { + IStrategy[] memory strategiesJustDeployed = strategyDeployer.createManyStrategies(batchSize); + for (uint256 j = 0; j < batchSize; j++) { + strategies[i * batchSize + j] = strategiesJustDeployed[j]; + } + strategyManager.addStrategiesToDepositWhitelist(strategiesJustDeployed); + } + + vm.stopBroadcast(); + + address[] memory strategyAddresses; + assembly { + strategyAddresses := strategies + } + string memory deployed_strategies = vm.serializeAddress("", "strategies", strategyAddresses); + + vm.writeJson(deployed_strategies, "script/output/devnet/deployed_strategies.json"); + } +} + + +contract StrategyDeployer { + address immutable beneficiary; + address immutable baseStrategyImplementation; + + constructor(address _beneficiary, address _baseStrategyImplementation) { + beneficiary = _beneficiary; + baseStrategyImplementation = _baseStrategyImplementation; + } + + function createManyStrategies(uint256 numStrategies) external returns(IStrategy[] memory) { + IStrategy[] memory strategies = new IStrategy[](numStrategies); + for (uint256 i = 0; i < numStrategies; i++) { + // create a strategy + strategies[i] = + StrategyBaseTVLLimits( + address( + new TransparentUpgradeableProxy( + baseStrategyImplementation, + baseStrategyImplementation, + abi.encodeWithSelector( + StrategyBaseTVLLimits.initialize.selector, + type(uint256).max, + type(uint256).max, + new ERC20PresetFixedSupply("Test", "TST", uint256(type(uint128).max), beneficiary), + address(1) + ) + ) + ) + ); + } + return strategies; + } +} \ No newline at end of file diff --git a/script/deploy/devnet/operatorSets/PopulateSRC.sol b/script/deploy/devnet/operatorSets/PopulateSRC.sol new file mode 100644 index 000000000..95b72d86b --- /dev/null +++ b/script/deploy/devnet/operatorSets/PopulateSRC.sol @@ -0,0 +1,263 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.12; + +import "../../../../src/contracts/core/StakeRootCompendium.sol"; +import "../../../utils/ExistingDeploymentParser.sol"; +import "forge-std/Test.sol"; +import "forge-std/Script.sol"; + + +contract PopulateSRC is Script, Test, ExistingDeploymentParser { + uint32 constant NUM_OPSETS = 1; + uint32 constant NUM_OPERATORS_PER_OPSET = 20; + uint32 constant NUM_STRATS_PER_OPSET = 2; + uint256 constant TOKEN_AMOUNT_PER_OPERATOR = 1 ether; + + + function run(string memory outputFile, string memory strategyFile) public { + _parseDeployedContracts(outputFile); + // other cast default. private key: 0x59c6995e998f97a5a0044966f0945389dc9e86dae88c7a8412f4603b6b78690d + address proxyAdmin = 0x70997970C51812dc3A010C7d01b50e0d17dc79C8; + + vm.startBroadcast(); + uint32 proofInterval = 1 hours; + IStakeRootCompendium stakeRootCompendiumImplementation = new StakeRootCompendium({ + _delegationManager: delegationManager, + _avsDirectory: avsDirectory, + _allocationManager: allocationManager, + _minBalanceThreshold: 0 ether, + _minPrepaidProofs: 20, + _verifier: address(0), + _imageId: bytes32(0) + }); + StakeRootCompendium stakeRootCompendium = StakeRootCompendium(payable(new TransparentUpgradeableProxy( + address(stakeRootCompendiumImplementation), + proxyAdmin, + abi.encodeWithSelector( + StakeRootCompendium.initialize.selector, + msg.sender, + msg.sender, + uint32(1 minutes), + IStakeRootCompendium.ChargeParams({ + chargePerOperatorSet: uint96(0), + chargePerStrategy: uint96(0), + maxChargePerProof: uint96(100 ether) + }) + ) + ))); + vm.stopBroadcast(); + emit log_named_address("allocationManager", address(allocationManager)); + emit log_named_address("StakeRootCompendium", address(stakeRootCompendium)); + + address[] memory allStrategies = _parseDeployedStrategies(strategyFile); + + // list of strategies for each operatorSet + IStrategy[][] memory strategies = new IStrategy[][](NUM_OPSETS); + for (uint256 i = 0; i < strategies.length; ++i) { + strategies[i] = new IStrategy[](NUM_STRATS_PER_OPSET); + for (uint256 j = 0; j < strategies[i].length; ++j) { + // fill in the strategies array + strategies[i][j] = IStrategy(allStrategies[i * strategies[i].length + j]); + } + } + + vm.broadcast(); + OperatorFactory operatorFactory = new OperatorFactory(delegationManager, strategyManager, allocationManager); + address[][] memory operators = new address[][](strategies.length); + for (uint i = 0; i < operators.length; i++) { + // todo: send operators[i].length*1 ether of strategy token to operatorfactory + // //transfer enough tokens for every operator in the operator set for all the strategies in the operator set + + for (uint j = 0; j < strategies[i].length; j++) { + IERC20 token = strategies[i][j].underlyingToken(); + vm.startBroadcast(); + token.approve(msg.sender, type(uint256).max); + token.transfer(address(operatorFactory), NUM_OPERATORS_PER_OPSET*TOKEN_AMOUNT_PER_OPERATOR); + vm.stopBroadcast(); + } + + vm.startBroadcast(); + operators[i] = operatorFactory.createManyOperators(NUM_OPERATORS_PER_OPSET); + for (uint j = 0; j < strategies[i].length; j++) { + operatorFactory.depositForOperators(strategies[i][j], operators[i], TOKEN_AMOUNT_PER_OPERATOR); + } + vm.stopBroadcast(); + } + + uint64 magnitudeForOperators = 0.1 ether; + vm.startBroadcast(); + AVS avs = new AVS(avsDirectory, stakeRootCompendium); + payable(address(avs)).transfer(2 * stakeRootCompendium.MIN_BALANCE_THRESHOLD() * strategies.length); + + for (uint i = 0; i < strategies.length; i++) { + avs.createOperatorSetAndRegisterOperators(uint32(i), strategies[i], operators[i]); + OperatorSet memory operatorSet = OperatorSet({ + avs: address(avs), + operatorSetId: uint32(i) + }); + for (uint j = 0; j < strategies[i].length; j++) { + operatorFactory.allocateForOperators(strategies[i][j], operatorSet, operators[i], magnitudeForOperators); + } + } + vm.stopBroadcast(); + + /// WRITE TO JSON + + // string memory output_path = "script/output/devnet/populate_src/"; + // FsMetadata[] memory metadata = vm.fsMetadata(output_path); + // for (uint256 i = 0; i < entries.length; ++i) { + // vm.removeFile(entries[i].path); + // } + for (uint256 i = 0; i < operators.length; ++i) { + address[] memory strategyAddresses = new address[](strategies[i].length); + for (uint256 j = 0; j < strategies[i].length; ++j) { + strategyAddresses[j] = address(strategies[i][j]); + } + + string memory parent_object = "success"; + vm.serializeAddress(parent_object, "StakeRootCompendium", address(stakeRootCompendium)); + vm.serializeAddress(parent_object, "avs", address(avs)); + vm.serializeAddress(parent_object, "operators", operators[i]); + vm.serializeAddress(parent_object, "strategies", strategyAddresses); + string memory finalJson = vm.serializeString("success", "success", parent_object); + vm.writeJson(finalJson, string.concat("script/output/devnet/populate_src/opset_", string.concat(vm.toString(i), ".json"))); + } + } +} + +contract AVS { + IAVSDirectory avsDirectory; + IStakeRootCompendium StakeRootCompendium; + + // creates an operator set for each list of strategies + constructor(IAVSDirectory _avsDirectory, IStakeRootCompendium _StakeRootCompendium) { + avsDirectory = _avsDirectory; + StakeRootCompendium = _StakeRootCompendium; + avsDirectory.becomeOperatorSetAVS(); + } + + function createOperatorSetAndRegisterOperators(uint32 operatorSetId, IStrategy[] memory strategies, address[] memory operators) external { + // create operator sets and become an AVS + uint32[] memory operatorSetIdsToCreate = new uint32[](1); + operatorSetIdsToCreate[0] = operatorSetId; + if(!avsDirectory.isOperatorSet(address(this), operatorSetId)) { + avsDirectory.createOperatorSets(operatorSetIdsToCreate); + + StakeRootCompendium.deposit{value: 2 * StakeRootCompendium.MIN_BALANCE_THRESHOLD()}(OperatorSet({ + avs: address(this), + operatorSetId: operatorSetId + })); + } + + // register operators to operator sets + for (uint256 i = 0; i < operators.length; ++i) { + avsDirectory.registerOperatorToOperatorSets( + operators[i], + operatorSetIdsToCreate, + ISignatureUtils.SignatureWithSaltAndExpiry({ + signature: hex"", + salt: keccak256(abi.encodePacked(address(this), operatorSetIdsToCreate)), + expiry: type(uint256).max + }) + ); + } + + // loop through strategies in batches of NUM_STRATS_PER_OPERATOR for each operator set + IStakeRootCompendium.StrategyAndMultiplier[] memory strategiesAndMultipliers = new IStakeRootCompendium.StrategyAndMultiplier[](strategies.length); + for (uint256 i = 0; i < strategiesAndMultipliers.length; ++i) { + strategiesAndMultipliers[i] = IStakeRootCompendium.StrategyAndMultiplier({ + strategy: strategies[i], + multiplier: 1 ether + }); + } + StakeRootCompendium.addOrModifyStrategiesAndMultipliers(operatorSetId, strategiesAndMultipliers); + StakeRootCompendium.setOperatorSetExtraData(operatorSetId, keccak256(abi.encodePacked(operatorSetId))); + for (uint256 i = 0; i < operators.length; ++i) { + StakeRootCompendium.setOperatorExtraData(operatorSetId, operators[i], keccak256(abi.encodePacked(operators[i]))); + } + } + + receive() external payable {} +} + + +contract OperatorFactory is Test { + IDelegationManager delegationManager; + IStrategyManager strategyManager; + IAllocationManager allocationManager; + constructor(IDelegationManager _delegationManager, IStrategyManager _strategyManager, IAllocationManager _allocationManager) { + delegationManager = _delegationManager; + strategyManager = _strategyManager; + allocationManager = _allocationManager; + } + + function createManyOperators(uint256 numOperatorsPerOpset) public returns(address[] memory) { + address[] memory operators = new address[](numOperatorsPerOpset); + for (uint256 i = 0; i < operators.length; ++i) { + operators[i] = address(new Operator(delegationManager, allocationManager)); + } + return operators; + } + + function depositForOperators(IStrategy strategy, address[] memory operators, uint256 tokenAmountPerOperator) public { + IERC20 token = strategy.underlyingToken(); + token.approve(address(strategyManager), type(uint256).max); + + for (uint256 i = 0; i < operators.length; ++i) { + strategyManager.depositIntoStrategyWithSignature(strategy, token, tokenAmountPerOperator, operators[i], type(uint256).max, hex""); + } + } + + function allocateForOperators(IStrategy strategy, OperatorSet calldata operatorSet, address[] memory operators, uint64 magnitudeForOperators) public { + uint64 expectedTotalMagnitude = WAD; + + OperatorSet[] memory operatorSets = new OperatorSet[](1); + operatorSets[0] = operatorSet; + + uint64[] memory magnitudes = new uint64[](1); + magnitudes[0] = magnitudeForOperators; + + IAllocationManager.MagnitudeAllocation[] memory allocations = new IAllocationManager.MagnitudeAllocation[](1); + allocations[0] = IAllocationManager.MagnitudeAllocation({ + strategy: strategy, + expectedTotalMagnitude: expectedTotalMagnitude, + operatorSets: operatorSets, + magnitudes: magnitudes + }); + + ISignatureUtils.SignatureWithSaltAndExpiry memory signature = ISignatureUtils.SignatureWithSaltAndExpiry({ + signature: hex"", + salt: keccak256(abi.encode(allocations)), + expiry: type(uint256).max + }); + + for (uint256 i = 0; i < operators.length; ++i) { + allocationManager.modifyAllocations( + operators[i], + allocations, + signature + ); + } + } +} + +contract Operator is IERC1271 { + constructor(IDelegationManager delegationManager, IAllocationManager allocationManager) { + // register as operator + IDelegationManager.OperatorDetails memory operatorDetails = IDelegationManager.OperatorDetails({ + __deprecated_earningsReceiver: address(this), + delegationApprover: address(0), + stakerOptOutWindowBlocks: 0 + }); + delegationManager.registerAsOperator( + operatorDetails, + 1, + "" + ); + } + + // sign everything + function isValidSignature(bytes32, bytes memory) external pure returns (bytes4 magicValue) { + return EIP1271SignatureUtils.EIP1271_MAGICVALUE; + } +} \ No newline at end of file diff --git a/script/deploy/devnet/operatorSets/README.md b/script/deploy/devnet/operatorSets/README.md new file mode 100644 index 000000000..13cbb6c22 --- /dev/null +++ b/script/deploy/devnet/operatorSets/README.md @@ -0,0 +1,48 @@ +# Setting up a test environment + +If you already have a state with strategies deployed, continue to (Step 2)[#step-2]. + +## Step 1: Deploy the strategies + +In the first terminal + +``` +anvil --dump-state state.json --gas-limit 18446744073709551615 +``` + +In the second terminal, deploy the core contracts + +``` +forge script script/deploy/devnet/Deploy_From_Scratch.s.sol --rpc-url localhost:8545 --private-key 0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80 --broadcast --skip-simulation --sig "run(string memory,string memory)" -- script/configs/devnet/deploy_from_scratch.anvil.config.json script/output/devnet/anvil.json +``` + +After configuring `DeployStrategies.s.sol` with the number of strategies you want to deploy, +``` +forge script script/deploy/devnet/operatorSets/DeployStrategies.s.sol:DeployStrategies --rpc-url localhost:8545 --private-key 0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80 --broadcast --skip-simulation --gas-limit 18446744073709551615 +``` + +Stop the anvil chain and retain the state + +## Step 2: Populate the AVSDirectory and StakeRootCompendium + +Start the anvil chain with the state + +``` +anvil --load-state state.json --gas-limit 18446744073709551615 +``` + +First, in order to run a new script you need to add a block to the chain. Simply do that with at transfer: + +``` +cast send --rpc-url localhost:8545 --private-key 0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80 --value=0ether 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb9226 +``` + +Then run the script, after configuring `PopulateSRC.sol` with the number of opsets and the number of operators per opset, + +``` +rm script/output/devnet/populate_src/* + +forge script script/deploy/devnet/operatorSets/PopulateSRC.sol:PopulateSRC --rpc-url localhost:8545 --private-key 0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80 --skip-simulation --broadcast --gas-limit 18446744073709551615 +``` + +Then move on to proving \ No newline at end of file diff --git a/script/deploy/holesky/Deploy_Preprod_RewardsCoordinator.s.sol b/script/deploy/holesky/Deploy_Preprod_RewardsCoordinator.s.sol index fa077f934..095bc3c8e 100644 --- a/script/deploy/holesky/Deploy_Preprod_RewardsCoordinator.s.sol +++ b/script/deploy/holesky/Deploy_Preprod_RewardsCoordinator.s.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.12; +pragma solidity ^0.8.27; import "./Deploy_Test_RewardsCoordinator.s.sol"; diff --git a/script/deploy/holesky/Deploy_Test_RewardsCoordinator.s.sol b/script/deploy/holesky/Deploy_Test_RewardsCoordinator.s.sol index 480123d70..b418737db 100644 --- a/script/deploy/holesky/Deploy_Test_RewardsCoordinator.s.sol +++ b/script/deploy/holesky/Deploy_Test_RewardsCoordinator.s.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.12; +pragma solidity ^0.8.27; import "../../utils/ExistingDeploymentParser.sol"; @@ -46,11 +46,14 @@ contract Deploy_Test_RewardsCoordinator is ExistingDeploymentParser { rewardsCoordinatorImplementation = new RewardsCoordinator( delegationManager, strategyManager, + avsDirectory, REWARDS_COORDINATOR_CALCULATION_INTERVAL_SECONDS, REWARDS_COORDINATOR_MAX_REWARDS_DURATION, REWARDS_COORDINATOR_MAX_RETROACTIVE_LENGTH, REWARDS_COORDINATOR_MAX_FUTURE_LENGTH, - REWARDS_COORDINATOR_GENESIS_REWARDS_TIMESTAMP + REWARDS_COORDINATOR_GENESIS_REWARDS_TIMESTAMP, + REWARDS_COORDINATOR_OPERATOR_SET_GENESIS_REWARDS_TIMESTAMP, + REWARDS_COORDINATOR_OPERATOR_SET_MAX_RETROACTIVE_LENGTH ); rewardsCoordinator = RewardsCoordinator( address( @@ -79,11 +82,14 @@ contract Deploy_Test_RewardsCoordinator is ExistingDeploymentParser { rewardsCoordinatorImplementation = new RewardsCoordinator( delegationManager, strategyManager, + avsDirectory, REWARDS_COORDINATOR_CALCULATION_INTERVAL_SECONDS, REWARDS_COORDINATOR_MAX_REWARDS_DURATION, REWARDS_COORDINATOR_MAX_RETROACTIVE_LENGTH, REWARDS_COORDINATOR_MAX_FUTURE_LENGTH, - REWARDS_COORDINATOR_GENESIS_REWARDS_TIMESTAMP + REWARDS_COORDINATOR_GENESIS_REWARDS_TIMESTAMP, + REWARDS_COORDINATOR_OPERATOR_SET_GENESIS_REWARDS_TIMESTAMP, + REWARDS_COORDINATOR_OPERATOR_SET_MAX_RETROACTIVE_LENGTH ); eigenLayerProxyAdmin.upgrade( @@ -119,11 +125,14 @@ contract Deploy_Test_RewardsCoordinator is ExistingDeploymentParser { rewardsCoordinatorImplementation = new RewardsCoordinator( delegationManager, strategyManager, + avsDirectory, REWARDS_COORDINATOR_CALCULATION_INTERVAL_SECONDS, REWARDS_COORDINATOR_MAX_REWARDS_DURATION, REWARDS_COORDINATOR_MAX_RETROACTIVE_LENGTH, REWARDS_COORDINATOR_MAX_FUTURE_LENGTH, - REWARDS_COORDINATOR_GENESIS_REWARDS_TIMESTAMP + REWARDS_COORDINATOR_GENESIS_REWARDS_TIMESTAMP, + REWARDS_COORDINATOR_OPERATOR_SET_GENESIS_REWARDS_TIMESTAMP, + REWARDS_COORDINATOR_OPERATOR_SET_MAX_RETROACTIVE_LENGTH ); } } diff --git a/script/deploy/holesky/Eigen_Strategy_Deploy.s.sol b/script/deploy/holesky/Eigen_Strategy_Deploy.s.sol index 233f158bb..c88c766f9 100644 --- a/script/deploy/holesky/Eigen_Strategy_Deploy.s.sol +++ b/script/deploy/holesky/Eigen_Strategy_Deploy.s.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.12; +pragma solidity ^0.8.27; import "../../utils/ExistingDeploymentParser.sol"; @@ -58,11 +58,9 @@ contract Eigen_Strategy_Deploy is ExistingDeploymentParser { function _verifyDeployment() internal { IStrategy[] memory strategies = new IStrategy[](1); strategies[0] = eigenStrategy; - bool[] memory thirdPartyTransfersForbiddenValues = new bool[](1); - thirdPartyTransfersForbiddenValues[0] = true; vm.prank(executorMultisig); - strategyManager.addStrategiesToDepositWhitelist(strategies, thirdPartyTransfersForbiddenValues); + strategyManager.addStrategiesToDepositWhitelist(strategies); vm.startPrank(msg.sender); EIGEN.approve(address(strategyManager), type(uint256).max); diff --git a/script/deploy/holesky/Eigen_Token_Deploy.s.sol b/script/deploy/holesky/Eigen_Token_Deploy.s.sol index bd130a034..d993eb105 100644 --- a/script/deploy/holesky/Eigen_Token_Deploy.s.sol +++ b/script/deploy/holesky/Eigen_Token_Deploy.s.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.12; +pragma solidity ^0.8.27; import "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol"; import "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; diff --git a/script/deploy/holesky/M2_Deploy_From_Scratch.s.sol b/script/deploy/holesky/M2_Deploy_From_Scratch.s.sol index 1e7e371ea..9b721da46 100644 --- a/script/deploy/holesky/M2_Deploy_From_Scratch.s.sol +++ b/script/deploy/holesky/M2_Deploy_From_Scratch.s.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.12; +pragma solidity ^0.8.27; import "../../utils/ExistingDeploymentParser.sol"; @@ -67,6 +67,10 @@ contract M2_Deploy_Holesky_From_Scratch is ExistingDeploymentParser { eigenPodManager = EigenPodManager( address(new TransparentUpgradeableProxy(address(emptyContract), address(eigenLayerProxyAdmin), "")) ); + allocationManager = AllocationManager( + address(new TransparentUpgradeableProxy(address(emptyContract), address(eigenLayerProxyAdmin), "")) + ); + // Deploy EigenPod Contracts eigenPodImplementation = new EigenPod( IETHPOSDeposit(ETHPOSDepositAddress), @@ -76,8 +80,8 @@ contract M2_Deploy_Holesky_From_Scratch is ExistingDeploymentParser { eigenPodBeacon = new UpgradeableBeacon(address(eigenPodImplementation)); avsDirectoryImplementation = new AVSDirectory(delegationManager); - delegationManagerImplementation = new DelegationManager(strategyManager, slasher, eigenPodManager); - strategyManagerImplementation = new StrategyManager(delegationManager, eigenPodManager, slasher); + delegationManagerImplementation = new DelegationManager(strategyManager, slasher, eigenPodManager, avsDirectory, allocationManager, MIN_WITHDRAWAL_DELAY); + strategyManagerImplementation = new StrategyManager(delegationManager, eigenPodManager, slasher, avsDirectory); slasherImplementation = new Slasher(strategyManager, delegationManager); eigenPodManagerImplementation = new EigenPodManager( IETHPOSDeposit(ETHPOSDepositAddress), @@ -86,6 +90,7 @@ contract M2_Deploy_Holesky_From_Scratch is ExistingDeploymentParser { slasher, delegationManager ); + allocationManagerImplementation = new AllocationManager(delegationManager, avsDirectory, DEALLOCATION_DELAY, ALLOCATION_DELAY_CONFIGURATION_DELAY); // Third, upgrade the proxy contracts to point to the implementations IStrategy[] memory initializeStrategiesToSetDelayBlocks = new IStrategy[](0); @@ -149,13 +154,23 @@ contract M2_Deploy_Holesky_From_Scratch is ExistingDeploymentParser { EIGENPOD_MANAGER_INIT_PAUSED_STATUS ) ); + // AllocationManager + eigenLayerProxyAdmin.upgradeAndCall( + TransparentUpgradeableProxy(payable(address(allocationManager))), + address(allocationManagerImplementation), + abi.encodeWithSelector( + AllocationManager.initialize.selector, + msg.sender, // initialOwner is msg.sender for now to set forktimestamp later + eigenLayerPauserReg, + ALLOCATION_MANAGER_INIT_PAUSED_STATUS + ) + ); // Deploy Strategies baseStrategyImplementation = new StrategyBaseTVLLimits(strategyManager); uint256 numStrategiesToDeploy = strategiesToDeploy.length; // whitelist params IStrategy[] memory strategiesToWhitelist = new IStrategy[](numStrategiesToDeploy); - bool[] memory thirdPartyTransfersForbiddenValues = new bool[](numStrategiesToDeploy); for (uint256 i = 0; i < numStrategiesToDeploy; i++) { StrategyUnderlyingTokenConfig memory strategyConfig = strategiesToDeploy[i]; @@ -177,13 +192,12 @@ contract M2_Deploy_Holesky_From_Scratch is ExistingDeploymentParser { ); strategiesToWhitelist[i] = strategy; - thirdPartyTransfersForbiddenValues[i] = false; deployedStrategyArray.push(strategy); } // Add strategies to whitelist and set whitelister to STRATEGY_MANAGER_WHITELISTER - strategyManager.addStrategiesToDepositWhitelist(strategiesToWhitelist, thirdPartyTransfersForbiddenValues); + strategyManager.addStrategiesToDepositWhitelist(strategiesToWhitelist); strategyManager.setStrategyWhitelister(STRATEGY_MANAGER_WHITELISTER); // Transfer ownership diff --git a/script/deploy/holesky/M2_Deploy_Preprod.s.sol b/script/deploy/holesky/M2_Deploy_Preprod.s.sol index 8dde5dde7..2d5dfc690 100644 --- a/script/deploy/holesky/M2_Deploy_Preprod.s.sol +++ b/script/deploy/holesky/M2_Deploy_Preprod.s.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.12; +pragma solidity ^0.8.27; import "./M2_Deploy_From_Scratch.s.sol"; diff --git a/script/deploy/holesky/longtail-preprod-upgrade.s.sol b/script/deploy/holesky/longtail-preprod-upgrade.s.sol index 2a9b7b9cf..f4202add9 100644 --- a/script/deploy/holesky/longtail-preprod-upgrade.s.sol +++ b/script/deploy/holesky/longtail-preprod-upgrade.s.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.12; +pragma solidity ^0.8.27; import "../../utils/ExistingDeploymentParser.sol"; diff --git a/script/deploy/holesky/v040-holesky-pepe.s.sol b/script/deploy/holesky/v040-holesky-pepe.s.sol index 6b12ccf56..b7c2dfd7b 100644 --- a/script/deploy/holesky/v040-holesky-pepe.s.sol +++ b/script/deploy/holesky/v040-holesky-pepe.s.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.12; +pragma solidity ^0.8.27; import "../../utils/ExistingDeploymentParser.sol"; diff --git a/script/deploy/holesky/v042-upgrade_testnet_rewardsCoordinator.s.sol b/script/deploy/holesky/v042-upgrade_testnet_rewardsCoordinator.s.sol index aeed0cc37..2426e5930 100644 --- a/script/deploy/holesky/v042-upgrade_testnet_rewardsCoordinator.s.sol +++ b/script/deploy/holesky/v042-upgrade_testnet_rewardsCoordinator.s.sol @@ -24,11 +24,14 @@ contract Upgrade_Testnet_RewardsCoordinator is Deploy_Test_RewardsCoordinator, T rewardsCoordinatorImplementation = new RewardsCoordinator( delegationManager, strategyManager, + avsDirectory, REWARDS_COORDINATOR_CALCULATION_INTERVAL_SECONDS, REWARDS_COORDINATOR_MAX_REWARDS_DURATION, REWARDS_COORDINATOR_MAX_RETROACTIVE_LENGTH, REWARDS_COORDINATOR_MAX_FUTURE_LENGTH, - REWARDS_COORDINATOR_GENESIS_REWARDS_TIMESTAMP + REWARDS_COORDINATOR_GENESIS_REWARDS_TIMESTAMP, + REWARDS_COORDINATOR_OPERATOR_SET_GENESIS_REWARDS_TIMESTAMP, + REWARDS_COORDINATOR_OPERATOR_SET_MAX_RETROACTIVE_LENGTH ); vm.stopBroadcast(); diff --git a/script/deploy/local/Deploy_From_Scratch.s.sol b/script/deploy/local/Deploy_From_Scratch.s.sol index a6e56b723..8e6c5539c 100644 --- a/script/deploy/local/Deploy_From_Scratch.s.sol +++ b/script/deploy/local/Deploy_From_Scratch.s.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.12; +pragma solidity ^0.8.27; import "@openzeppelin/contracts/token/ERC20/presets/ERC20PresetFixedSupply.sol"; import "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol"; @@ -13,6 +13,7 @@ import "../../../src/contracts/core/Slasher.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/strategies/StrategyBaseTVLLimits.sol"; @@ -31,7 +32,7 @@ import "forge-std/Test.sol"; // source .env // # To deploy and verify our contract -// RUST_LOG=forge,foundry=trace forge script script/deploy/local/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 +// forge script script/deploy/local/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 { Vm cheats = Vm(HEVM_ADDRESS); @@ -63,6 +64,8 @@ contract DeployFromScratch is Script, Test { UpgradeableBeacon public eigenPodBeacon; EigenPod public eigenPodImplementation; StrategyBase public baseStrategyImplementation; + AllocationManager public allocationManagerImplementation; + AllocationManager public allocationManager; EmptyContract public emptyContract; @@ -86,6 +89,13 @@ contract DeployFromScratch is Script, Test { uint256 EIGENPOD_MANAGER_INIT_PAUSED_STATUS; uint256 REWARDS_COORDINATOR_INIT_PAUSED_STATUS; + // DelegationManager + uint32 MIN_WITHDRAWAL_DELAY; + + // AllocationManager + uint32 DEALLOCATION_DELAY; + uint32 ALLOCATION_DELAY_CONFIGURATION_DELAY; + // RewardsCoordinator uint32 REWARDS_COORDINATOR_MAX_REWARDS_DURATION; uint32 REWARDS_COORDINATOR_MAX_RETROACTIVE_LENGTH; @@ -98,6 +108,9 @@ contract DeployFromScratch is Script, Test { uint32 REWARDS_COORDINATOR_OPERATOR_SET_GENESIS_REWARDS_TIMESTAMP; uint32 REWARDS_COORDINATOR_OPERATOR_SET_MAX_RETROACTIVE_LENGTH; + // AllocationManager + uint256 ALLOCATION_MANAGER_INIT_PAUSED_STATUS; + // one week in blocks -- 50400 uint32 STRATEGY_MANAGER_INIT_WITHDRAWAL_DELAY_BLOCKS; uint256 DELEGATION_WITHDRAWAL_DELAY_BLOCKS; @@ -147,6 +160,16 @@ contract DeployFromScratch is Script, Test { stdJson.readUint(config_data, ".strategyManager.init_withdrawal_delay_blocks") ); + ALLOCATION_MANAGER_INIT_PAUSED_STATUS = uint32( + stdJson.readUint(config_data, ".allocationManager.init_paused_status") + ); + DEALLOCATION_DELAY = uint32( + stdJson.readUint(config_data, ".allocationManager.DEALLOCATION_DELAY") + ); + ALLOCATION_DELAY_CONFIGURATION_DELAY = uint32( + stdJson.readUint(config_data, ".allocationManager.ALLOCATION_DELAY_CONFIGURATION_DELAY") + ); + // tokens to deploy strategies for StrategyConfig[] memory strategyConfigs; @@ -198,6 +221,9 @@ contract DeployFromScratch is Script, Test { rewardsCoordinator = RewardsCoordinator( address(new TransparentUpgradeableProxy(address(emptyContract), address(eigenLayerProxyAdmin), "")) ); + allocationManager = AllocationManager( + address(new TransparentUpgradeableProxy(address(emptyContract), address(eigenLayerProxyAdmin), "")) + ); // if on mainnet, use the ETH2 deposit contract address if (chainId == 1) { @@ -215,8 +241,9 @@ contract DeployFromScratch is Script, Test { eigenPodBeacon = new UpgradeableBeacon(address(eigenPodImplementation)); // Second, deploy the *implementation* contracts, using the *proxy contracts* as inputs - delegationImplementation = new DelegationManager(strategyManager, slasher, eigenPodManager); - strategyManagerImplementation = new StrategyManager(delegation, eigenPodManager, slasher); + + delegationImplementation = new DelegationManager(strategyManager, slasher, eigenPodManager, avsDirectory, allocationManager, MIN_WITHDRAWAL_DELAY); + strategyManagerImplementation = new StrategyManager(delegation, eigenPodManager, slasher, avsDirectory); avsDirectoryImplementation = new AVSDirectory(delegation); slasherImplementation = new Slasher(strategyManager, delegation); eigenPodManagerImplementation = new EigenPodManager( @@ -229,12 +256,16 @@ contract DeployFromScratch is Script, Test { rewardsCoordinatorImplementation = new RewardsCoordinator( delegation, strategyManager, + avsDirectory, REWARDS_COORDINATOR_CALCULATION_INTERVAL_SECONDS, REWARDS_COORDINATOR_MAX_REWARDS_DURATION, REWARDS_COORDINATOR_MAX_RETROACTIVE_LENGTH, REWARDS_COORDINATOR_MAX_FUTURE_LENGTH, - REWARDS_COORDINATOR_GENESIS_REWARDS_TIMESTAMP + REWARDS_COORDINATOR_GENESIS_REWARDS_TIMESTAMP, + REWARDS_COORDINATOR_OPERATOR_SET_GENESIS_REWARDS_TIMESTAMP, + REWARDS_COORDINATOR_OPERATOR_SET_MAX_RETROACTIVE_LENGTH ); + allocationManagerImplementation = new AllocationManager(delegation, avsDirectory, DEALLOCATION_DELAY, ALLOCATION_DELAY_CONFIGURATION_DELAY); // Third, upgrade the proxy contracts to use the correct implementation contracts and initialize them. { @@ -304,6 +335,17 @@ contract DeployFromScratch is Script, Test { ) ); + eigenLayerProxyAdmin.upgradeAndCall( + TransparentUpgradeableProxy(payable(address(allocationManager))), + address(allocationManagerImplementation), + abi.encodeWithSelector( + AllocationManager.initialize.selector, + executorMultisig, + eigenLayerPauserReg, + ALLOCATION_MANAGER_INIT_PAUSED_STATUS + ) + ); + // deploy StrategyBaseTVLLimits contract implementation baseStrategyImplementation = new StrategyBaseTVLLimits(strategyManager); // create upgradeable proxies that each point to the implementation and initialize them @@ -381,6 +423,8 @@ contract DeployFromScratch is Script, Test { vm.serializeAddress(deployed_addresses, "delegationManagerImplementation", address(delegationImplementation)); vm.serializeAddress(deployed_addresses, "avsDirectory", address(avsDirectory)); vm.serializeAddress(deployed_addresses, "avsDirectoryImplementation", address(avsDirectoryImplementation)); + vm.serializeAddress(deployed_addresses, "allocationManager", address(allocationManager)); + vm.serializeAddress(deployed_addresses, "allocationManagerImplementation", address(allocationManagerImplementation)); vm.serializeAddress(deployed_addresses, "strategyManager", address(strategyManager)); vm.serializeAddress( deployed_addresses, @@ -433,13 +477,7 @@ contract DeployFromScratch is Script, Test { string memory finalJson = vm.serializeString(parent_object, parameters, parameters_output); // TODO: should output to different file depending on configFile passed to run() // so that we don't override mainnet output by deploying to goerli for eg. - vm.writeJson(finalJson, "script/output/devnet/local_from_scratch_deployment_data.json"); - - // generate + write eigenpods to file - address podAddress = eigenPodManager.createPod(); - string memory eigenpodStruct = "eigenpodStruct"; - string memory json = vm.serializeAddress(eigenpodStruct, "podAddress", podAddress); - vm.writeJson(json, "script/output/eigenpods.json"); + vm.writeJson(finalJson, "script/output/devnet/M2_from_scratch_deployment_data.json"); } function _verifyContractsPointAtOneAnother( @@ -527,6 +565,13 @@ contract DeployFromScratch is Script, Test { "rewardsCoordinator: implementation set incorrectly" ); + require( + eigenLayerProxyAdmin.getProxyImplementation( + TransparentUpgradeableProxy(payable(address(allocationManager))) + ) == address(allocationManagerImplementation), + "allocationManager: implementation set incorrectly" + ); + for (uint256 i = 0; i < deployedStrategyArray.length; ++i) { require( eigenLayerProxyAdmin.getProxyImplementation( diff --git a/script/deploy/local/operatorSets/DeployStrategies.s.sol b/script/deploy/local/operatorSets/DeployStrategies.s.sol new file mode 100644 index 000000000..e2f05e806 --- /dev/null +++ b/script/deploy/local/operatorSets/DeployStrategies.s.sol @@ -0,0 +1,79 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.27; + +import "@openzeppelin/contracts/token/ERC20/presets/ERC20PresetFixedSupply.sol"; +import "../../../utils/ExistingDeploymentParser.sol"; + +// # To load the variables in the .env file +// source .env + +// # To deploy and verify our contract +contract DeployStrategies is ExistingDeploymentParser { + + function run() external { + _parseDeployedContracts("script/output/devnet/M2_from_scratch_deployment_data.json"); + + vm.startBroadcast(); + StrategyDeployer strategyDeployer = new StrategyDeployer( + executorMultisig, + address(baseStrategyImplementation) + ); + uint256 batches = 1; + uint256 batchSize = 100; + + IStrategy[] memory strategies = new IStrategy[](batchSize * batches); + + for (uint256 i = 0; i < batches; i++) { + IStrategy[] memory strategiesJustDeployed = strategyDeployer.createManyStrategies(batchSize); + for (uint256 j = 0; j < batchSize; j++) { + strategies[i * batchSize + j] = strategiesJustDeployed[j]; + } + strategyManager.addStrategiesToDepositWhitelist(strategiesJustDeployed); + } + + vm.stopBroadcast(); + + address[] memory strategyAddresses; + assembly { + strategyAddresses := strategies + } + string memory deployed_strategies = vm.serializeAddress("", "strategies", strategyAddresses); + + vm.writeJson(deployed_strategies, "script/output/devnet/deployed_strategies.json"); + } +} + + +contract StrategyDeployer { + address immutable beneficiary; + address immutable baseStrategyImplementation; + + constructor(address _beneficiary, address _baseStrategyImplementation) { + beneficiary = _beneficiary; + baseStrategyImplementation = _baseStrategyImplementation; + } + + function createManyStrategies(uint256 numStrategies) external returns(IStrategy[] memory) { + IStrategy[] memory strategies = new IStrategy[](numStrategies); + for (uint256 i = 0; i < numStrategies; i++) { + // create a strategy + strategies[i] = + StrategyBaseTVLLimits( + address( + new TransparentUpgradeableProxy( + address(baseStrategyImplementation), + address(1), + abi.encodeWithSelector( + StrategyBaseTVLLimits.initialize.selector, + type(uint256).max, + type(uint256).max, + new ERC20PresetFixedSupply("Test", "TST", uint256(type(uint128).max), beneficiary), + address(1) + ) + ) + ) + ); + } + return strategies; + } +} \ No newline at end of file diff --git a/script/deploy/mainnet/Deploy_Strategy_Factory.s.sol b/script/deploy/mainnet/Deploy_Strategy_Factory.s.sol new file mode 100644 index 000000000..fa5d93707 --- /dev/null +++ b/script/deploy/mainnet/Deploy_Strategy_Factory.s.sol @@ -0,0 +1,61 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.27; + +import "@openzeppelin/contracts/utils/Create2.sol"; +import "../../utils/ExistingDeploymentParser.sol"; + +import "../../../src/contracts/strategies/StrategyFactory.sol"; + +/** + * @notice Script used for the first deployment of EigenLayer core contracts to Holesky + * FORK LOCAL + * anvil --fork-url $RPC_MAINNET + * forge script script/deploy/mainnet/Deploy_Strategy_Factory.s.sol:MainnetStrategyFactoryDeploy --rpc-url http://127.0.0.1:8545 --private-key $PRIVATE_KEY --broadcast -vvvv + * + * MAINNET + * forge script script/deploy/mainnet/Deploy_Strategy_Factory.s.sol:MainnetStrategyFactoryDeploy --rpc-url $RPC_MAINNET --private-key $PRIVATE_KEY --verify --broadcast -vvvv + * + */ + +contract MainnetStrategyFactoryDeploy is ExistingDeploymentParser { + function run() external virtual { + // Use rewards config + _parseInitialDeploymentParams( + "script/configs/mainnet/v0.3.0-mainnet-rewards.config.json" + ); + _parseDeployedContracts( + "script/configs/mainnet/Mainnet_curent_deployment.config.json" + ); + + // START RECORDING TRANSACTIONS FOR DEPLOYMENT + vm.startBroadcast(); + + emit log_named_address("Deployer Address", msg.sender); + + _deployStrategyFactory(); + + // STOP RECORDING TRANSACTIONS FOR DEPLOYMENT + vm.stopBroadcast(); + + // Sanity Checks + _verifyContractPointers(); + _verifyImplementations(); + _verifyContractsInitialized(); + _verifyInitializationParams(); + + logAndOutputContractAddresses("script/output/mainnet/v0.3.2-mainnet-strategy-factory.output.json"); + } + + /** + * @notice Deploy StrategyFactory for Mainnet + */ + + function _deployStrategyFactory() internal { + strategyFactoryImplementation = new StrategyFactory( + strategyManager + ); + + + + } +} \ No newline at end of file diff --git a/script/deploy/mainnet/EigenPod_Minor_Upgrade_Deploy.s.sol b/script/deploy/mainnet/EigenPod_Minor_Upgrade_Deploy.s.sol index 774e85dc8..9f0ac1d4a 100644 --- a/script/deploy/mainnet/EigenPod_Minor_Upgrade_Deploy.s.sol +++ b/script/deploy/mainnet/EigenPod_Minor_Upgrade_Deploy.s.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.12; +pragma solidity ^0.8.27; import "@openzeppelin/contracts/token/ERC20/presets/ERC20PresetFixedSupply.sol"; import "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol"; diff --git a/script/deploy/mainnet/M2_Mainnet_Upgrade.s.sol b/script/deploy/mainnet/M2_Mainnet_Upgrade.s.sol index c69bbe108..21a9ab05f 100644 --- a/script/deploy/mainnet/M2_Mainnet_Upgrade.s.sol +++ b/script/deploy/mainnet/M2_Mainnet_Upgrade.s.sol @@ -1,335 +1,335 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.12; - -import "../../utils/ExistingDeploymentParser.sol"; -import "../../utils/TimelockEncoding.sol"; -import "../../utils/Multisend.sol"; - -/** - * @notice Script used for the first deployment of EigenLayer core contracts to Holesky - * anvil --fork-url $RPC_MAINNET - * forge script script/deploy/mainnet/M2_Mainnet_Upgrade.s.sol:M2_Mainnet_Upgrade --rpc-url http://127.0.0.1:8545 --private-key $PRIVATE_KEY --broadcast -vvvv - * - * forge script script/deploy/mainnet/M2_Mainnet_Upgrade.s.sol:M2_Mainnet_Upgrade --rpc-url $RPC_MAINNET --private-key $PRIVATE_KEY --broadcast -vvvv - * - */ -contract M2_Mainnet_Upgrade is ExistingDeploymentParser { - function run() external virtual { - _parseDeployedContracts("script/output/mainnet/M1_deployment_mainnet_2023_6_9.json"); - _parseInitialDeploymentParams("script/configs/mainnet/M2_mainnet_upgrade.config.json"); - - // START RECORDING TRANSACTIONS FOR DEPLOYMENT - vm.startBroadcast(); - - emit log_named_address("Deployer Address", msg.sender); - - _deployImplementationContracts(); - - // STOP RECORDING TRANSACTIONS FOR DEPLOYMENT - vm.stopBroadcast(); - - // Simulate upgrade of contracts to new implementations - _simulateUpgrade(); - - // Sanity Checks - _verifyContractPointers(); - _verifyImplementations(); - _verifyContractsInitialized(); - _verifyInitializationParams(); - - logAndOutputContractAddresses("script/output/mainnet/M2_mainnet_upgrade.output.json"); - } - - /** - * @notice Deploy EigenLayer contracts from scratch for Holesky - */ - function _deployImplementationContracts() internal { - // 1. Deploy New TUPS - avsDirectoryImplementation = new AVSDirectory(delegationManager); - avsDirectory = AVSDirectory( - address( - new TransparentUpgradeableProxy( - address(avsDirectoryImplementation), - address(eigenLayerProxyAdmin), - abi.encodeWithSelector( - AVSDirectory.initialize.selector, - executorMultisig, // initialOwner - eigenLayerPauserReg, - AVS_DIRECTORY_INIT_PAUSED_STATUS - ) - ) - ) - ); - - // 2. Deploy Implementations - eigenPodImplementation = new EigenPod( - IETHPOSDeposit(ETHPOSDepositAddress), - eigenPodManager, - EIGENPOD_GENESIS_TIME - ); - delegationManagerImplementation = new DelegationManager(strategyManager, slasher, eigenPodManager); - strategyManagerImplementation = new StrategyManager(delegationManager, eigenPodManager, slasher); - slasherImplementation = new Slasher(strategyManager, delegationManager); - eigenPodManagerImplementation = new EigenPodManager( - IETHPOSDeposit(ETHPOSDepositAddress), - eigenPodBeacon, - strategyManager, - slasher, - delegationManager - ); - } - - function _simulateUpgrade() internal { - - vm.startPrank(executorMultisig); - - // First, upgrade the proxy contracts to point to the implementations - // AVSDirectory - // eigenLayerProxyAdmin.upgrade( - // TransparentUpgradeableProxy(payable(address(avsDirectory))), - // address(avsDirectoryImplementation) - // ); - // DelegationManager - eigenLayerProxyAdmin.upgrade( - TransparentUpgradeableProxy(payable(address(delegationManager))), - address(delegationManagerImplementation) - ); - // StrategyManager - eigenLayerProxyAdmin.upgrade( - TransparentUpgradeableProxy(payable(address(strategyManager))), - address(strategyManagerImplementation) - ); - // Slasher - eigenLayerProxyAdmin.upgrade( - TransparentUpgradeableProxy(payable(address(slasher))), - address(slasherImplementation) - ); - // EigenPodManager - eigenLayerProxyAdmin.upgrade( - TransparentUpgradeableProxy(payable(address(eigenPodManager))), - address(eigenPodManagerImplementation) - ); - - // Second, configure additional settings and paused statuses - delegationManager.setMinWithdrawalDelayBlocks(DELEGATION_MANAGER_MIN_WITHDRAWAL_DELAY_BLOCKS); - delegationManager.unpause(0); - eigenPodManager.unpause(0); - - eigenPodBeacon.upgradeTo(address(eigenPodImplementation)); - - vm.stopPrank(); - } -} - -// forge t --mt test_queueUpgrade --fork-url $RPC_MAINNET -vvvv -contract Queue_M2_Upgrade is M2_Mainnet_Upgrade, TimelockEncoding { - Vm cheats = Vm(HEVM_ADDRESS); - - // Thurs Apr 08 2024 12:00:00 GMT-0700 (Pacific Daylight Time) - uint256 timelockEta = 1712559600; - - function test_queueUpgrade() external { - _parseDeployedContracts("script/output/mainnet/M2_mainnet_upgrade.output.json"); - _parseInitialDeploymentParams("script/configs/mainnet/M2_mainnet_upgrade.config.json"); - - Tx[] memory txs = new Tx[](11); - // upgrade the DelegationManager, Slasher, StrategyManager, DelayedWithdrawalRouter, EigenPodManager, & EigenPod contracts - txs[0] = Tx( - address(eigenLayerProxyAdmin), - 0, - abi.encodeWithSelector( - ProxyAdmin.upgrade.selector, - TransparentUpgradeableProxy(payable(address(delegationManager))), - delegationManagerImplementation - ) - ); - - txs[1] = Tx( - address(eigenLayerProxyAdmin), - 0, - abi.encodeWithSelector( - ProxyAdmin.upgrade.selector, - TransparentUpgradeableProxy(payable(address(slasher))), - slasherImplementation - ) - ); - - txs[2] = Tx( - address(eigenLayerProxyAdmin), - 0, - abi.encodeWithSelector( - ProxyAdmin.upgrade.selector, - TransparentUpgradeableProxy(payable(address(strategyManager))), - strategyManagerImplementation - ) - ); - - // txs[3] = Tx( - // address(eigenLayerProxyAdmin), - // 0, - // abi.encodeWithSelector( - // ProxyAdmin.upgrade.selector, - // TransparentUpgradeableProxy(payable(address(delayedWithdrawalRouter))), - // delayedWithdrawalRouterImplementation - // ) - // ); - - txs[4] = Tx( - address(eigenLayerProxyAdmin), - 0, - abi.encodeWithSelector( - ProxyAdmin.upgrade.selector, - TransparentUpgradeableProxy(payable(address(eigenPodManager))), - eigenPodManagerImplementation - ) - ); - - txs[5] = Tx( - address(eigenPodBeacon), - 0, - abi.encodeWithSelector( - UpgradeableBeacon.upgradeTo.selector, - eigenPodImplementation - ) - ); - - // set the min withdrawal delay blocks on the DelegationManager - txs[6] = Tx( - address(delegationManager), - 0, // value - abi.encodeWithSelector(DelegationManager.setMinWithdrawalDelayBlocks.selector, DELEGATION_MANAGER_MIN_WITHDRAWAL_DELAY_BLOCKS) - ); - - // set beacon chain oracle on EigenPodManager - // txs[7] = Tx( - // address(eigenPodManager), - // 0, // value - // abi.encodeWithSelector(EigenPodManager.updateBeaconChainOracle.selector, beaconOracle) - // ); - - // set Deneb fork timestamp on EigenPodManager - // txs[8] = Tx( - // address(eigenPodManager), - // 0, // value - // abi.encodeWithSelector(EigenPodManager.setDenebForkTimestamp.selector, EIGENPOD_MANAGER_DENEB_FORK_TIMESTAMP) - // ); - - // unpause everything on DelegationManager - txs[9] = Tx( - address(delegationManager), - 0, // value - abi.encodeWithSelector(Pausable.unpause.selector, 0) - ); - - // unpause everything on EigenPodManager - txs[10] = Tx( - address(eigenPodManager), - 0, // value - abi.encodeWithSelector(Pausable.unpause.selector, 0) - ); - - bytes memory calldata_to_multisend_contract = abi.encodeWithSelector(MultiSendCallOnly.multiSend.selector, encodeMultisendTxs(txs)); - emit log_named_bytes("calldata_to_multisend_contract", calldata_to_multisend_contract); - - bytes memory final_calldata_to_executor_multisig = encodeForExecutor({ - // call to executor will be from the timelock - from: timelock, - // performing many operations at the same time - to: multiSendCallOnly, - // value to send in tx - value: 0, - // calldata for the operation - data: calldata_to_multisend_contract, - // operation type (for performing many operations at the same time) - operation: ISafe.Operation.DelegateCall - }); - - (bytes memory calldata_to_timelock_queuing_action, bytes memory calldata_to_timelock_executing_action) = encodeForTimelock({ - // address to be called from the timelock - to: executorMultisig, - // value to send in tx - value: 0, - // calldata for the operation - data: final_calldata_to_executor_multisig, - // time at which the tx will become executable - timelockEta: timelockEta - }); - - bytes32 expectedTxHash = getTxHash({ - target: executorMultisig, - _value: 0, - _data: final_calldata_to_executor_multisig, - eta: timelockEta - }); - emit log_named_bytes32("expectedTxHash", expectedTxHash); - - cheats.prank(operationsMultisig); - (bool success, ) = timelock.call(calldata_to_timelock_queuing_action); - require(success, "call to timelock queuing action failed"); - - require(ITimelock(timelock).queuedTransactions(expectedTxHash), "expectedTxHash not queued"); - - // test performing the upgrade - cheats.warp(timelockEta); - cheats.prank(operationsMultisig); - (success, ) = timelock.call(calldata_to_timelock_executing_action); - require(success, "call to timelock executing action failed"); - - // Check correctness after upgrade - _verifyContractPointers(); - _verifyImplementations(); - _verifyContractsInitialized(); - _verifyInitializationParams(); - _postUpgradeChecks(); - } - - function _postUpgradeChecks() internal { - // check that LST deposits are paused - address rETH = 0xae78736Cd615f374D3085123A210448E74Fc6393; - address rETH_Strategy = 0x1BeE69b7dFFfA4E2d53C2a2Df135C388AD25dCD2; - uint256 amount = 1e18; - cheats.prank(rETH); - // this works because rETH has more than 1 ETH of its own token at its address :) - IERC20(rETH).transfer(address(this), amount); - IERC20(rETH).approve(address(strategyManager), amount); - cheats.expectRevert("Pausable: index is paused"); - strategyManager.depositIntoStrategy({ - strategy: IStrategy(rETH_Strategy), - token: IERC20(rETH), - amount: amount - }); - - // unpause LST deposits and check that a deposit works - cheats.prank(executorMultisig); - strategyManager.unpause(0); - strategyManager.depositIntoStrategy({ - strategy: IStrategy(rETH_Strategy), - token: IERC20(rETH), - amount: amount - }); - - // check that EigenPod proofs are live (although this still reverts later in the call) - EigenPod existingEigenPod = EigenPod(payable(0x0b347D5E38296277E829CE1D8C6b82e4c63C2Df3)); - BeaconChainProofs.StateRootProof memory stateRootProof; - uint40[] memory validatorIndices; - bytes[] memory validatorFieldsProofs; - bytes32[][] memory validatorFields; - cheats.startPrank(existingEigenPod.podOwner()); - existingEigenPod.startCheckpoint(false); - cheats.expectRevert("EigenPodManager.getBlockRootAtTimestamp: state root at timestamp not yet finalized"); - existingEigenPod.verifyWithdrawalCredentials( - uint64(block.timestamp), - stateRootProof, - validatorIndices, - validatorFieldsProofs, - validatorFields - ); - } - - function getTxHash(address target, uint256 _value, bytes memory _data, uint256 eta) public pure returns (bytes32) { - // empty bytes - bytes memory signature; - bytes32 txHash = keccak256(abi.encode(target, _value, signature, _data, eta)); - return txHash; - } -} +// // SPDX-License-Identifier: BUSL-1.1 +// pragma solidity ^0.8.27; + +// import "../../utils/ExistingDeploymentParser.sol"; +// import "../../utils/TimelockEncoding.sol"; +// import "../../utils/Multisend.sol"; + +// /** +// * @notice Script used for the first deployment of EigenLayer core contracts to Holesky +// * anvil --fork-url $RPC_MAINNET +// * forge script script/deploy/mainnet/M2_Mainnet_Upgrade.s.sol:M2_Mainnet_Upgrade --rpc-url http://127.0.0.1:8545 --private-key $PRIVATE_KEY --broadcast -vvvv +// * +// * forge script script/deploy/mainnet/M2_Mainnet_Upgrade.s.sol:M2_Mainnet_Upgrade --rpc-url $RPC_MAINNET --private-key $PRIVATE_KEY --broadcast -vvvv +// * +// */ +// contract M2_Mainnet_Upgrade is ExistingDeploymentParser { +// function run() external virtual { +// _parseDeployedContracts("script/output/mainnet/M1_deployment_mainnet_2023_6_9.json"); +// _parseInitialDeploymentParams("script/configs/mainnet/M2_mainnet_upgrade.config.json"); + +// // START RECORDING TRANSACTIONS FOR DEPLOYMENT +// vm.startBroadcast(); + +// emit log_named_address("Deployer Address", msg.sender); + +// _deployImplementationContracts(); + +// // STOP RECORDING TRANSACTIONS FOR DEPLOYMENT +// vm.stopBroadcast(); + +// // Simulate upgrade of contracts to new implementations +// _simulateUpgrade(); + +// // Sanity Checks +// _verifyContractPointers(); +// _verifyImplementations(); +// _verifyContractsInitialized(); +// _verifyInitializationParams(); + +// logAndOutputContractAddresses("script/output/mainnet/M2_mainnet_upgrade.output.json"); +// } + +// /** +// * @notice Deploy EigenLayer contracts from scratch for Holesky +// */ +// function _deployImplementationContracts() internal { +// // 1. Deploy New TUPS +// avsDirectoryImplementation = new AVSDirectory(delegationManager); +// avsDirectory = AVSDirectory( +// address( +// new TransparentUpgradeableProxy( +// address(avsDirectoryImplementation), +// address(eigenLayerProxyAdmin), +// abi.encodeWithSelector( +// AVSDirectory.initialize.selector, +// executorMultisig, // initialOwner +// eigenLayerPauserReg, +// AVS_DIRECTORY_INIT_PAUSED_STATUS +// ) +// ) +// ) +// ); + +// // 2. Deploy Implementations +// eigenPodImplementation = new EigenPod( +// IETHPOSDeposit(ETHPOSDepositAddress), +// eigenPodManager, +// EIGENPOD_GENESIS_TIME +// ); +// delegationManagerImplementation = new DelegationManager(strategyManager, slasher, eigenPodManager); +// strategyManagerImplementation = new StrategyManager(delegationManager, eigenPodManager, slasher, avsDirectory); +// slasherImplementation = new Slasher(strategyManager, delegationManager); +// eigenPodManagerImplementation = new EigenPodManager( +// IETHPOSDeposit(ETHPOSDepositAddress), +// eigenPodBeacon, +// strategyManager, +// slasher, +// delegationManager +// ); +// } + +// function _simulateUpgrade() internal { + +// vm.startPrank(executorMultisig); + +// // First, upgrade the proxy contracts to point to the implementations +// // AVSDirectory +// // eigenLayerProxyAdmin.upgrade( +// // TransparentUpgradeableProxy(payable(address(avsDirectory))), +// // address(avsDirectoryImplementation) +// // ); +// // DelegationManager +// eigenLayerProxyAdmin.upgrade( +// TransparentUpgradeableProxy(payable(address(delegationManager))), +// address(delegationManagerImplementation) +// ); +// // StrategyManager +// eigenLayerProxyAdmin.upgrade( +// TransparentUpgradeableProxy(payable(address(strategyManager))), +// address(strategyManagerImplementation) +// ); +// // Slasher +// eigenLayerProxyAdmin.upgrade( +// TransparentUpgradeableProxy(payable(address(slasher))), +// address(slasherImplementation) +// ); +// // EigenPodManager +// eigenLayerProxyAdmin.upgrade( +// TransparentUpgradeableProxy(payable(address(eigenPodManager))), +// address(eigenPodManagerImplementation) +// ); + +// // Second, configure additional settings and paused statuses +// delegationManager.setMinWithdrawalDelayBlocks(DELEGATION_MANAGER_MIN_WITHDRAWAL_DELAY_BLOCKS); +// delegationManager.unpause(0); +// eigenPodManager.unpause(0); + +// eigenPodBeacon.upgradeTo(address(eigenPodImplementation)); + +// vm.stopPrank(); +// } +// } + +// // forge t --mt test_queueUpgrade --fork-url $RPC_MAINNET -vvvv +// contract Queue_M2_Upgrade is M2_Mainnet_Upgrade, TimelockEncoding { +// Vm cheats = Vm(HEVM_ADDRESS); + +// // Thurs Apr 08 2024 12:00:00 GMT-0700 (Pacific Daylight Time) +// uint256 timelockEta = 1712559600; + +// function test_queueUpgrade() external { +// _parseDeployedContracts("script/output/mainnet/M2_mainnet_upgrade.output.json"); +// _parseInitialDeploymentParams("script/configs/mainnet/M2_mainnet_upgrade.config.json"); + +// Tx[] memory txs = new Tx[](11); +// // upgrade the DelegationManager, Slasher, StrategyManager, DelayedWithdrawalRouter, EigenPodManager, & EigenPod contracts +// txs[0] = Tx( +// address(eigenLayerProxyAdmin), +// 0, +// abi.encodeWithSelector( +// ProxyAdmin.upgrade.selector, +// TransparentUpgradeableProxy(payable(address(delegationManager))), +// delegationManagerImplementation +// ) +// ); + +// txs[1] = Tx( +// address(eigenLayerProxyAdmin), +// 0, +// abi.encodeWithSelector( +// ProxyAdmin.upgrade.selector, +// TransparentUpgradeableProxy(payable(address(slasher))), +// slasherImplementation +// ) +// ); + +// txs[2] = Tx( +// address(eigenLayerProxyAdmin), +// 0, +// abi.encodeWithSelector( +// ProxyAdmin.upgrade.selector, +// TransparentUpgradeableProxy(payable(address(strategyManager))), +// strategyManagerImplementation +// ) +// ); + +// // txs[3] = Tx( +// // address(eigenLayerProxyAdmin), +// // 0, +// // abi.encodeWithSelector( +// // ProxyAdmin.upgrade.selector, +// // TransparentUpgradeableProxy(payable(address(delayedWithdrawalRouter))), +// // delayedWithdrawalRouterImplementation +// // ) +// // ); + +// txs[4] = Tx( +// address(eigenLayerProxyAdmin), +// 0, +// abi.encodeWithSelector( +// ProxyAdmin.upgrade.selector, +// TransparentUpgradeableProxy(payable(address(eigenPodManager))), +// eigenPodManagerImplementation +// ) +// ); + +// txs[5] = Tx( +// address(eigenPodBeacon), +// 0, +// abi.encodeWithSelector( +// UpgradeableBeacon.upgradeTo.selector, +// eigenPodImplementation +// ) +// ); + +// // set the min withdrawal delay blocks on the DelegationManager +// txs[6] = Tx( +// address(delegationManager), +// 0, // value +// abi.encodeWithSelector(DelegationManager.setMinWithdrawalDelayBlocks.selector, DELEGATION_MANAGER_MIN_WITHDRAWAL_DELAY_BLOCKS) +// ); + +// // set beacon chain oracle on EigenPodManager +// // txs[7] = Tx( +// // address(eigenPodManager), +// // 0, // value +// // abi.encodeWithSelector(EigenPodManager.updateBeaconChainOracle.selector, beaconOracle) +// // ); + +// // set Deneb fork timestamp on EigenPodManager +// // txs[8] = Tx( +// // address(eigenPodManager), +// // 0, // value +// // abi.encodeWithSelector(EigenPodManager.setDenebForkTimestamp.selector, EIGENPOD_MANAGER_DENEB_FORK_TIMESTAMP) +// // ); + +// // unpause everything on DelegationManager +// txs[9] = Tx( +// address(delegationManager), +// 0, // value +// abi.encodeWithSelector(Pausable.unpause.selector, 0) +// ); + +// // unpause everything on EigenPodManager +// txs[10] = Tx( +// address(eigenPodManager), +// 0, // value +// abi.encodeWithSelector(Pausable.unpause.selector, 0) +// ); + +// bytes memory calldata_to_multisend_contract = abi.encodeWithSelector(MultiSendCallOnly.multiSend.selector, encodeMultisendTxs(txs)); +// emit log_named_bytes("calldata_to_multisend_contract", calldata_to_multisend_contract); + +// bytes memory final_calldata_to_executor_multisig = encodeForExecutor({ +// // call to executor will be from the timelock +// from: timelock, +// // performing many operations at the same time +// to: multiSendCallOnly, +// // value to send in tx +// value: 0, +// // calldata for the operation +// data: calldata_to_multisend_contract, +// // operation type (for performing many operations at the same time) +// operation: ISafe.Operation.DelegateCall +// }); + +// (bytes memory calldata_to_timelock_queuing_action, bytes memory calldata_to_timelock_executing_action) = encodeForTimelock({ +// // address to be called from the timelock +// to: executorMultisig, +// // value to send in tx +// value: 0, +// // calldata for the operation +// data: final_calldata_to_executor_multisig, +// // time at which the tx will become executable +// timelockEta: timelockEta +// }); + +// bytes32 expectedTxHash = getTxHash({ +// target: executorMultisig, +// _value: 0, +// _data: final_calldata_to_executor_multisig, +// eta: timelockEta +// }); +// emit log_named_bytes32("expectedTxHash", expectedTxHash); + +// cheats.prank(operationsMultisig); +// (bool success, ) = timelock.call(calldata_to_timelock_queuing_action); +// require(success, "call to timelock queuing action failed"); + +// require(ITimelock(timelock).queuedTransactions(expectedTxHash), "expectedTxHash not queued"); + +// // test performing the upgrade +// cheats.warp(timelockEta); +// cheats.prank(operationsMultisig); +// (success, ) = timelock.call(calldata_to_timelock_executing_action); +// require(success, "call to timelock executing action failed"); + +// // Check correctness after upgrade +// _verifyContractPointers(); +// _verifyImplementations(); +// _verifyContractsInitialized(); +// _verifyInitializationParams(); +// _postUpgradeChecks(); +// } + +// function _postUpgradeChecks() internal { +// // check that LST deposits are paused +// address rETH = 0xae78736Cd615f374D3085123A210448E74Fc6393; +// address rETH_Strategy = 0x1BeE69b7dFFfA4E2d53C2a2Df135C388AD25dCD2; +// uint256 amount = 1e18; +// cheats.prank(rETH); +// // this works because rETH has more than 1 ETH of its own token at its address :) +// IERC20(rETH).transfer(address(this), amount); +// IERC20(rETH).approve(address(strategyManager), amount); +// cheats.expectRevert("Pausable: index is paused"); +// strategyManager.depositIntoStrategy({ +// strategy: IStrategy(rETH_Strategy), +// token: IERC20(rETH), +// amount: amount +// }); + +// // unpause LST deposits and check that a deposit works +// cheats.prank(executorMultisig); +// strategyManager.unpause(0); +// strategyManager.depositIntoStrategy({ +// strategy: IStrategy(rETH_Strategy), +// token: IERC20(rETH), +// amount: amount +// }); + +// // check that EigenPod proofs are live (although this still reverts later in the call) +// EigenPod existingEigenPod = EigenPod(payable(0x0b347D5E38296277E829CE1D8C6b82e4c63C2Df3)); +// BeaconChainProofs.StateRootProof memory stateRootProof; +// uint40[] memory validatorIndices; +// bytes[] memory validatorFieldsProofs; +// bytes32[][] memory validatorFields; +// cheats.startPrank(existingEigenPod.podOwner()); +// existingEigenPod.startCheckpoint(false); +// cheats.expectRevert("EigenPodManager.getBlockRootAtTimestamp: state root at timestamp not yet finalized"); +// existingEigenPod.verifyWithdrawalCredentials( +// uint64(block.timestamp), +// stateRootProof, +// validatorIndices, +// validatorFieldsProofs, +// validatorFields +// ); +// } + +// function getTxHash(address target, uint256 _value, bytes memory _data, uint256 eta) public pure returns (bytes32) { +// // empty bytes +// bytes memory signature; +// bytes32 txHash = keccak256(abi.encode(target, _value, signature, _data, eta)); +// return txHash; +// } +// } diff --git a/script/deploy/mainnet/v0.3.0-mainnet-rewards.s.sol b/script/deploy/mainnet/v0.3.0-mainnet-rewards.s.sol index 1fe59bed4..5067db34b 100644 --- a/script/deploy/mainnet/v0.3.0-mainnet-rewards.s.sol +++ b/script/deploy/mainnet/v0.3.0-mainnet-rewards.s.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.12; +pragma solidity ^0.8.27; import "@openzeppelin/contracts/utils/Create2.sol"; import "../../utils/ExistingDeploymentParser.sol"; @@ -52,11 +52,14 @@ contract MainnetRewardsCoordinatorDeploy is ExistingDeploymentParser { rewardsCoordinatorImplementation = new RewardsCoordinator( delegationManager, strategyManager, + avsDirectory, REWARDS_COORDINATOR_CALCULATION_INTERVAL_SECONDS, REWARDS_COORDINATOR_MAX_REWARDS_DURATION, REWARDS_COORDINATOR_MAX_RETROACTIVE_LENGTH, REWARDS_COORDINATOR_MAX_FUTURE_LENGTH, - REWARDS_COORDINATOR_GENESIS_REWARDS_TIMESTAMP + REWARDS_COORDINATOR_GENESIS_REWARDS_TIMESTAMP, + REWARDS_COORDINATOR_OPERATOR_SET_GENESIS_REWARDS_TIMESTAMP, + REWARDS_COORDINATOR_OPERATOR_SET_MAX_RETROACTIVE_LENGTH ); rewardsCoordinator = RewardsCoordinator( address( @@ -85,11 +88,14 @@ contract MainnetRewardsCoordinatorDeploy is ExistingDeploymentParser { rewardsCoordinatorImplementation = new RewardsCoordinator( delegationManager, strategyManager, + avsDirectory, REWARDS_COORDINATOR_CALCULATION_INTERVAL_SECONDS, REWARDS_COORDINATOR_MAX_REWARDS_DURATION, REWARDS_COORDINATOR_MAX_RETROACTIVE_LENGTH, REWARDS_COORDINATOR_MAX_FUTURE_LENGTH, - REWARDS_COORDINATOR_GENESIS_REWARDS_TIMESTAMP + REWARDS_COORDINATOR_GENESIS_REWARDS_TIMESTAMP, + REWARDS_COORDINATOR_OPERATOR_SET_GENESIS_REWARDS_TIMESTAMP, + REWARDS_COORDINATOR_OPERATOR_SET_MAX_RETROACTIVE_LENGTH ); eigenLayerProxyAdmin.upgrade( diff --git a/script/deploy/mainnet/v0.4.2-mainnet-pepe.s.sol b/script/deploy/mainnet/v0.4.2-mainnet-pepe.s.sol index 9d3447e07..3ad0b8d2a 100644 --- a/script/deploy/mainnet/v0.4.2-mainnet-pepe.s.sol +++ b/script/deploy/mainnet/v0.4.2-mainnet-pepe.s.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.12; +pragma solidity ^0.8.27; import "@openzeppelin/contracts/utils/Create2.sol"; import "../../utils/ExistingDeploymentParser.sol"; diff --git a/script/utils/ExistingDeploymentParser.sol b/script/utils/ExistingDeploymentParser.sol index 23f24557b..bd2ddfb3b 100644 --- a/script/utils/ExistingDeploymentParser.sol +++ b/script/utils/ExistingDeploymentParser.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.12; +pragma solidity ^0.8.27; import "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol"; import "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; @@ -10,6 +10,7 @@ import "../../src/contracts/core/Slasher.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/strategies/StrategyFactory.sol"; import "../../src/contracts/strategies/StrategyBase.sol"; @@ -62,6 +63,8 @@ contract ExistingDeploymentParser is Script, Test { StrategyBase public baseStrategyImplementation; StrategyFactory public strategyFactory; StrategyFactory public strategyFactoryImplementation; + AllocationManager public allocationManager; + AllocationManager public allocationManagerImplementation; UpgradeableBeacon public strategyBeacon; StrategyBase public strategyFactoryBeaconImplementation; @@ -105,6 +108,7 @@ contract ExistingDeploymentParser is Script, Test { // DelegationManager uint256 DELEGATION_MANAGER_INIT_PAUSED_STATUS; uint256 DELEGATION_MANAGER_MIN_WITHDRAWAL_DELAY_BLOCKS; + uint32 MIN_WITHDRAWAL_DELAY; // AVSDirectory uint256 AVS_DIRECTORY_INIT_PAUSED_STATUS; // RewardsCoordinator @@ -117,8 +121,14 @@ contract ExistingDeploymentParser is Script, Test { uint32 REWARDS_COORDINATOR_ACTIVATION_DELAY; uint32 REWARDS_COORDINATOR_CALCULATION_INTERVAL_SECONDS; uint32 REWARDS_COORDINATOR_GLOBAL_OPERATOR_COMMISSION_BIPS; + uint32 REWARDS_COORDINATOR_OPERATOR_SET_GENESIS_REWARDS_TIMESTAMP; + uint32 REWARDS_COORDINATOR_OPERATOR_SET_MAX_RETROACTIVE_LENGTH; // EigenPodManager uint256 EIGENPOD_MANAGER_INIT_PAUSED_STATUS; + // AllocationManager + uint256 ALLOCATION_MANAGER_INIT_PAUSED_STATUS; + uint32 DEALLOCATION_DELAY; + uint32 ALLOCATION_DELAY_CONFIGURATION_DELAY; // EigenPod uint64 EIGENPOD_GENESIS_TIME; uint64 EIGENPOD_MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR; @@ -171,6 +181,12 @@ contract ExistingDeploymentParser is Script, Test { avsDirectoryImplementation = AVSDirectory( stdJson.readAddress(existingDeploymentData, ".addresses.avsDirectoryImplementation") ); + allocationManager = AllocationManager( + stdJson.readAddress(existingDeploymentData, ".addresses.allocationManager") + ); + allocationManagerImplementation = AllocationManager( + stdJson.readAddress(existingDeploymentData, ".addresses.allocationManagerImplementation") + ); rewardsCoordinator = RewardsCoordinator( stdJson.readAddress(existingDeploymentData, ".addresses.rewardsCoordinator") ); @@ -314,6 +330,12 @@ contract ExistingDeploymentParser is Script, Test { REWARDS_COORDINATOR_GLOBAL_OPERATOR_COMMISSION_BIPS = uint32( stdJson.readUint(initialDeploymentData, ".rewardsCoordinator.global_operator_commission_bips") ); + REWARDS_COORDINATOR_OPERATOR_SET_GENESIS_REWARDS_TIMESTAMP = uint32( + stdJson.readUint(initialDeploymentData, ".rewardsCoordinator.OPERATOR_SET_GENESIS_REWARDS_TIMESTAMP") + ); + REWARDS_COORDINATOR_OPERATOR_SET_MAX_RETROACTIVE_LENGTH = uint32( + stdJson.readUint(initialDeploymentData, ".rewardsCoordinator.OPERATOR_SET_MAX_RETROACTIVE_LENGTH") + ); // AVSDirectory AVS_DIRECTORY_INIT_PAUSED_STATUS = stdJson.readUint(initialDeploymentData, ".avsDirectory.init_paused_status"); // EigenPodManager @@ -321,6 +343,11 @@ contract ExistingDeploymentParser is Script, Test { initialDeploymentData, ".eigenPodManager.init_paused_status" ); + // AllocationManager + ALLOCATION_MANAGER_INIT_PAUSED_STATUS = stdJson.readUint( + initialDeploymentData, + ".allocationManager.init_paused_status" + ); // EigenPod EIGENPOD_GENESIS_TIME = uint64(stdJson.readUint(initialDeploymentData, ".eigenPod.GENESIS_TIME")); ETHPOSDepositAddress = stdJson.readAddress(initialDeploymentData, ".ethPOSDepositAddress"); @@ -328,6 +355,15 @@ contract ExistingDeploymentParser is Script, Test { logInitialDeploymentParams(); } + function _parseDeployedStrategies(string memory existingStrategyDeploymentInfoPath) internal returns (address[] memory strategyAddresses) { + uint256 currentChainId = block.chainid; + + // READ JSON CONFIG DATA + string memory existingDeploymentData = vm.readFile(existingStrategyDeploymentInfoPath); + strategyAddresses = stdJson.readAddressArray(existingDeploymentData, ".strategies"); + return strategyAddresses; + } + /// @notice Ensure contracts point at each other correctly via constructors function _verifyContractPointers() internal view virtual { // AVSDirectory @@ -461,10 +497,7 @@ contract ExistingDeploymentParser is Script, Test { delegationManager.initialize( address(0), eigenLayerPauserReg, - 0, - 0, // minWithdrawalDelayBLocks - initializeStrategiesToSetDelayBlocks, - initializeWithdrawalDelayBlocks + 0 ); // StrategyManager vm.expectRevert(bytes("Initializable: contract is already initialized")); @@ -555,10 +588,6 @@ contract ExistingDeploymentParser is Script, Test { delegationManager.paused() == DELEGATION_MANAGER_INIT_PAUSED_STATUS, "delegationManager: init paused status set incorrectly" ); - require( - delegationManager.minWithdrawalDelayBlocks() == DELEGATION_MANAGER_MIN_WITHDRAWAL_DELAY_BLOCKS, - "delegationManager: minWithdrawalDelayBlocks not set correctly" - ); // StrategyManager require( strategyManager.pauserRegistry() == eigenLayerPauserReg, @@ -694,6 +723,8 @@ contract ExistingDeploymentParser is Script, Test { vm.serializeAddress(deployed_addresses, "slasherImplementation", address(slasherImplementation)); vm.serializeAddress(deployed_addresses, "avsDirectory", address(avsDirectory)); vm.serializeAddress(deployed_addresses, "avsDirectoryImplementation", address(avsDirectoryImplementation)); + vm.serializeAddress(deployed_addresses, "allocationManager", address(allocationManager)); + vm.serializeAddress(deployed_addresses, "allocationManagerImplementation", address(allocationManagerImplementation)); vm.serializeAddress(deployed_addresses, "delegationManager", address(delegationManager)); vm.serializeAddress( deployed_addresses, @@ -722,11 +753,14 @@ contract ExistingDeploymentParser is Script, Test { vm.serializeAddress(deployed_addresses, "eigenPodImplementation", address(eigenPodImplementation)); vm.serializeAddress(deployed_addresses, "baseStrategyImplementation", address(baseStrategyImplementation)); vm.serializeAddress(deployed_addresses, "emptyContract", address(emptyContract)); + vm.serializeUint(deployed_addresses, "numStrategiesDeployed", numStrategiesDeployed); string memory deployed_addresses_output = vm.serializeString( deployed_addresses, "strategies", deployed_strategies_output ); + string memory token = '{"tokenProxyAdmin": "0x0000000000000000000000000000000000000000", "EIGEN": "0x0000000000000000000000000000000000000000","bEIGEN": "0x0000000000000000000000000000000000000000","EIGENImpl": "0x0000000000000000000000000000000000000000","bEIGENImpl": "0x0000000000000000000000000000000000000000","eigenStrategy": "0x0000000000000000000000000000000000000000","eigenStrategyImpl": "0x0000000000000000000000000000000000000000"}'; + deployed_addresses_output = vm.serializeString(deployed_addresses, "token", token); string memory parameters = "parameters"; vm.serializeAddress(parameters, "executorMultisig", executorMultisig); @@ -743,6 +777,7 @@ contract ExistingDeploymentParser is Script, Test { // serialize all the data vm.serializeString(parent_object, deployed_addresses, deployed_addresses_output); vm.serializeString(parent_object, chain_info, chain_info_output); + vm.serializeString(parent_object, "lastUpdated", "N/A"); string memory finalJson = vm.serializeString(parent_object, parameters, parameters_output); vm.writeJson(finalJson, outputPath); diff --git a/script/utils/TimelockEncoding.sol b/script/utils/TimelockEncoding.sol index cbb0c8da3..c2eaad396 100644 --- a/script/utils/TimelockEncoding.sol +++ b/script/utils/TimelockEncoding.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.12; +pragma solidity ^0.8.27; import "forge-std/Script.sol"; import "forge-std/Test.sol"; diff --git a/script/whitelist/Staker.sol b/script/whitelist/Staker.sol index f353610ce..c2ec20af1 100644 --- a/script/whitelist/Staker.sol +++ b/script/whitelist/Staker.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.12; +pragma solidity ^0.8.27; import "../../src/contracts/interfaces/IStrategyManager.sol"; import "../../src/contracts/interfaces/IStrategy.sol"; diff --git a/script/whitelist/delegationFaucet/DelegationFaucet.sol b/script/whitelist/delegationFaucet/DelegationFaucet.sol deleted file mode 100644 index 327e8e678..000000000 --- a/script/whitelist/delegationFaucet/DelegationFaucet.sol +++ /dev/null @@ -1,216 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.12; - -import "src/contracts/interfaces/IStrategyManager.sol"; -import "src/contracts/interfaces/IStrategy.sol"; -import "src/contracts/interfaces/IDelegationManager.sol"; -import "src/contracts/interfaces/IDelegationFaucet.sol"; -import "script/whitelist/delegationFaucet/DelegationFaucetStaker.sol"; - -import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; -import "@openzeppelin/contracts/access/Ownable.sol"; -import "@openzeppelin/contracts/utils/Create2.sol"; -import "@openzeppelin/contracts/utils/Address.sol"; - -import "../ERC20PresetMinterPauser.sol"; - -/** - * @title DelegationFaucet for M2 - * @author Layr Labs, Inc. - * @notice Faucet contract setup with a dummy ERC20 token and strategy for M2 testnet release. - * Each operator address gets a staker contract assigned to them deterministically. - * This contract assumes minting role of the ERC20 token and that the ERC20 token has a whitelisted strategy. - */ -contract DelegationFaucet is IDelegationFaucet, Ownable { - IStrategyManager immutable strategyManager; - ERC20PresetMinterPauser immutable stakeToken; - IStrategy immutable stakeStrategy; - IDelegationManager immutable delegation; - - uint256 public constant DEFAULT_AMOUNT = 100e18; - - constructor( - IStrategyManager _strategyManager, - IDelegationManager _delegation, - ERC20PresetMinterPauser _token, - IStrategy _strategy - ) { - strategyManager = _strategyManager; - delegation = _delegation; - stakeToken = _token; - stakeStrategy = _strategy; - } - - /** - * Deploys a DelegationFaucetStaker contract if not already deployed for operator. DelegationFaucetStaker gets minted _depositAmount or - * DEFAULT_AMOUNT if _depositAmount is 0. Then DelegationFaucetStaker contract deposits into the strategy and delegates to operator. - * @param _operator The operator to delegate to - * @param _approverSignatureAndExpiry Verifies the operator approves of this delegation - * @param _approverSalt A unique single use value tied to an individual signature. - * @param _depositAmount The amount to deposit into the strategy - */ - function mintDepositAndDelegate( - address _operator, - IDelegationManager.SignatureWithExpiry memory _approverSignatureAndExpiry, - bytes32 _approverSalt, - uint256 _depositAmount - ) public onlyOwner { - // Operator must be registered - require(delegation.isOperator(_operator), "DelegationFaucet: Operator not registered"); - address staker = getStaker(_operator); - // Set deposit amount - if (_depositAmount == 0) { - _depositAmount = DEFAULT_AMOUNT; - } - - // Deploy staker address if not already deployed, staker constructor will approve the StrategyManager to spend the stakeToken - if (!Address.isContract(staker)) { - Create2.deploy( - 0, - bytes32(uint256(uint160(_operator))), - abi.encodePacked(type(DelegationFaucetStaker).creationCode, abi.encode(strategyManager, stakeToken)) - ); - } - - // mint stakeToken to staker - stakeToken.mint(staker, _depositAmount); - // deposit into stakeToken strategy, which will increase delegated shares to operator if already delegated - _depositIntoStrategy(staker, stakeStrategy, stakeToken, _depositAmount); - // delegateTo operator if not delegated - if (!delegation.isDelegated(staker)) { - delegateTo(_operator, _approverSignatureAndExpiry, _approverSalt); - } - } - - /** - * Calls staker contract to deposit into designated strategy, mints staked token if stakeToken and stakeStrategy - * are specified. - * @param _staker address of staker contract for operator - * @param _strategy StakeToken strategy contract - * @param _token StakeToken - * @param _amount amount to get minted and to deposit - */ - function depositIntoStrategy( - address _staker, - IStrategy _strategy, - IERC20 _token, - uint256 _amount - ) public onlyOwner returns (bytes memory) { - // mint stakeToken to staker - if (_token == stakeToken && _strategy == stakeStrategy) { - stakeToken.mint(_staker, _amount); - } - return _depositIntoStrategy(_staker, _strategy, _token, _amount); - } - - /** - * Call staker to delegate to operator - * @param _operator operator to get staker address from and delegate to - * @param _approverSignatureAndExpiry Verifies the operator approves of this delegation - * @param _approverSalt A unique single use value tied to an individual signature. - */ - function delegateTo( - address _operator, - IDelegationManager.SignatureWithExpiry memory _approverSignatureAndExpiry, - bytes32 _approverSalt - ) public onlyOwner returns (bytes memory) { - bytes memory data = abi.encodeWithSelector( - IDelegationManager.delegateTo.selector, - _operator, - _approverSignatureAndExpiry, - _approverSalt - ); - return DelegationFaucetStaker(getStaker(_operator)).callAddress(address(delegation), data); - } - - /** - * Call queueWithdrawal through staker contract - */ - function queueWithdrawal( - address staker, - IDelegationManager.QueuedWithdrawalParams[] calldata queuedWithdrawalParams - ) public onlyOwner returns (bytes memory) { - bytes memory data = abi.encodeWithSelector( - IDelegationManager.queueWithdrawals.selector, - queuedWithdrawalParams - ); - return DelegationFaucetStaker(staker).callAddress(address(delegation), data); - } - - /** - * Call completeQueuedWithdrawal through staker contract - */ - function completeQueuedWithdrawal( - address staker, - IDelegationManager.Withdrawal calldata queuedWithdrawal, - IERC20[] calldata tokens, - uint256 middlewareTimesIndex, - bool receiveAsTokens - ) public onlyOwner returns (bytes memory) { - bytes memory data = abi.encodeWithSelector( - IDelegationManager.completeQueuedWithdrawal.selector, - queuedWithdrawal, - tokens, - middlewareTimesIndex, - receiveAsTokens - ); - return DelegationFaucetStaker(staker).callAddress(address(delegation), data); - } - - /** - * Transfers tokens from staker contract to designated address - * @param staker staker contract to transfer from - * @param token ERC20 token - * @param to the to address - * @param amount transfer amount - */ - function transfer( - address staker, - address token, - address to, - uint256 amount - ) public onlyOwner returns (bytes memory) { - bytes memory data = abi.encodeWithSelector(IERC20.transfer.selector, to, amount); - return DelegationFaucetStaker(staker).callAddress(token, data); - } - - function callAddress(address to, bytes memory data) public payable onlyOwner returns (bytes memory) { - (bool ok, bytes memory res) = payable(to).call{value: msg.value}(data); - if (!ok) { - revert(string(res)); - } - return res; - } - - /** - * @notice Returns the deterministic staker contract address for the operator - * @param _operator The operator to get the staker contract address for - */ - function getStaker(address _operator) public view returns (address) { - return - Create2.computeAddress( - bytes32(uint256(uint160(_operator))), //salt - keccak256( - abi.encodePacked(type(DelegationFaucetStaker).creationCode, abi.encode(strategyManager, stakeToken)) - ) - ); - } - - /** - * @notice Internal function to deposit into a strategy, has same function signature as StrategyManager.depositIntoStrategy - */ - function _depositIntoStrategy( - address _staker, - IStrategy _strategy, - IERC20 _token, - uint256 _amount - ) internal returns (bytes memory) { - bytes memory data = abi.encodeWithSelector( - IStrategyManager.depositIntoStrategy.selector, - _strategy, - _token, - _amount - ); - return DelegationFaucetStaker(_staker).callAddress(address(strategyManager), data); - } -} diff --git a/script/whitelist/delegationFaucet/DelegationFaucetStaker.sol b/script/whitelist/delegationFaucet/DelegationFaucetStaker.sol deleted file mode 100644 index fac0e543c..000000000 --- a/script/whitelist/delegationFaucet/DelegationFaucetStaker.sol +++ /dev/null @@ -1,26 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.12; - -import "src/contracts/interfaces/IStrategyManager.sol"; - -import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; -import "@openzeppelin/contracts/access/Ownable.sol"; -import "forge-std/Test.sol"; - -contract DelegationFaucetStaker is Ownable { - constructor(IStrategyManager strategyManager, IERC20 token) Ownable() { - token.approve(address(strategyManager), type(uint256).max); - } - - function callAddress(address implementation, bytes memory data) external onlyOwner returns (bytes memory) { - uint256 length = data.length; - bytes memory returndata; - assembly { - let result := call(gas(), implementation, callvalue(), add(data, 32), length, 0, 0) - mstore(returndata, returndatasize()) - returndatacopy(add(returndata, 32), 0, returndatasize()) - } - - return returndata; - } -} diff --git a/script/whitelist/delegationFaucet/DeployDelegationFaucet.sol b/script/whitelist/delegationFaucet/DeployDelegationFaucet.sol deleted file mode 100644 index db458e99d..000000000 --- a/script/whitelist/delegationFaucet/DeployDelegationFaucet.sol +++ /dev/null @@ -1,84 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.12; - -import "src/contracts/interfaces/IDelegationManager.sol"; -import "src/contracts/interfaces/IStrategyManager.sol"; -import "src/contracts/strategies/StrategyBase.sol"; -import "src/contracts/permissions/PauserRegistry.sol"; - -import "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol"; - -import "./DelegationFaucet.sol"; - -import "forge-std/Script.sol"; -import "forge-std/StdJson.sol"; - -/** - * @notice Deploys the following contracts: - * - ERC20 Dummy token for testing - * - StrategyBase to be added to the StrategyManager whitelist - * - DelegationFaucet contract - */ -contract DeployDelegationFaucet is Script, DSTest { - // EigenLayer contracts - ProxyAdmin public eigenLayerProxyAdmin; - PauserRegistry public eigenLayerPauserReg; - IDelegationManager public delegation; - IStrategyManager public strategyManager; - - DelegationFaucet public delegationFaucet; - - // M2 testing/mock contracts - ERC20PresetMinterPauser public stakeToken; - StrategyBase public stakeTokenStrat; - StrategyBase public baseStrategyImplementation; - - address eigenLayerProxyAdminAddress; - address eigenLayerPauserRegAddress; - address delegationAddress; - address strategyManagerAddress; - address operationsMultisig; - address executorMultisig; - - bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE"); - - function run() external { - string memory goerliDeploymentConfig = vm.readFile("script/output/M1_deployment_goerli_2023_3_23.json"); - _setAddresses(goerliDeploymentConfig); - - vm.startBroadcast(); - // Deploy ERC20 stakeToken - stakeToken = new ERC20PresetMinterPauser("StakeToken", "STK"); - - // Deploy StrategyBase for stakeToken & whitelist it - baseStrategyImplementation = new StrategyBase(strategyManager); - stakeTokenStrat = StrategyBase( - address( - new TransparentUpgradeableProxy( - address(baseStrategyImplementation), - eigenLayerProxyAdminAddress, - abi.encodeWithSelector(StrategyBase.initialize.selector, stakeToken, eigenLayerPauserRegAddress) - ) - ) - ); - - // Needs to be strategyManager.strategyWhitelister() to add STK strategy - // IStrategy[] memory _strategy = new IStrategy[](1); - // _strategy[0] = stakeTokenStrat; - // strategyManager.addStrategiesToDepositWhitelist(_strategy); - - // Deploy DelegationFaucet, grant it admin/mint/pauser roles, etc. - delegationFaucet = new DelegationFaucet(strategyManager, delegation, stakeToken, stakeTokenStrat); - stakeToken.grantRole(MINTER_ROLE, address(delegationFaucet)); - vm.stopBroadcast(); - } - - function _setAddresses(string memory config) internal { - eigenLayerProxyAdminAddress = stdJson.readAddress(config, ".addresses.eigenLayerProxyAdmin"); - eigenLayerPauserRegAddress = stdJson.readAddress(config, ".addresses.eigenLayerPauserReg"); - delegationAddress = stdJson.readAddress(config, ".addresses.delegation"); - strategyManagerAddress = stdJson.readAddress(config, ".addresses.strategyManager"); - operationsMultisig = stdJson.readAddress(config, ".parameters.operationsMultisig"); - executorMultisig = stdJson.readAddress(config, ".parameters.executorMultisig"); - } -} diff --git a/src/contracts/core/AVSDirectory.sol b/src/contracts/core/AVSDirectory.sol index c1d004a8b..13b35f114 100644 --- a/src/contracts/core/AVSDirectory.sol +++ b/src/contracts/core/AVSDirectory.sol @@ -1,9 +1,10 @@ // SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.12; +pragma solidity ^0.8.27; import "@openzeppelin-upgrades/contracts/proxy/utils/Initializable.sol"; import "@openzeppelin-upgrades/contracts/access/OwnableUpgradeable.sol"; import "@openzeppelin-upgrades/contracts/security/ReentrancyGuardUpgradeable.sol"; + import "../permissions/Pausable.sol"; import "../libraries/EIP1271SignatureUtils.sol"; import "./AVSDirectoryStorage.sol"; @@ -15,10 +16,15 @@ contract AVSDirectory is AVSDirectoryStorage, ReentrancyGuardUpgradeable { - // @dev Index for flag that pauses operator register/deregister to avs when set. + using EnumerableSet for EnumerableSet.Bytes32Set; + using EnumerableSet for EnumerableSet.AddressSet; + + /// @dev Index for flag that pauses operator register/deregister to avs when set. uint8 internal constant PAUSED_OPERATOR_REGISTER_DEREGISTER_TO_AVS = 0; + /// @dev Index for flag that pauses operator register/deregister to operator sets when set. + uint8 internal constant PAUSER_OPERATOR_REGISTER_DEREGISTER_TO_OPERATOR_SETS = 1; - // @dev Chain ID at the time of contract deployment + /// @dev Returns the chain ID from the time the contract was deployed. uint256 internal immutable ORIGINAL_CHAIN_ID; /** @@ -31,7 +37,9 @@ contract AVSDirectory is * @dev Initializes the immutable addresses of the strategy mananger, delegationManager, slasher, * and eigenpodManager contracts */ - constructor(IDelegationManager _delegation) AVSDirectoryStorage(_delegation) { + constructor( + IDelegationManager _delegation + ) AVSDirectoryStorage(_delegation) { _disableInitializers(); ORIGINAL_CHAIN_ID = block.chainid; } @@ -52,73 +60,275 @@ contract AVSDirectory is /** * - * EXTERNAL FUNCTIONS + * EXTERNAL FUNCTIONS * */ /** - * @notice Called by the AVS's service manager contract to register an operator with the avs. - * @param operator The address of the operator to register. - * @param operatorSignature The signature, salt, and expiry of the operator's signature. + * @notice Called by an AVS to create a list of new operatorSets. + * + * @param operatorSetIds The IDs of the operator set to initialize. + * + * @dev msg.sender must be the AVS. + * @dev The AVS may create operator sets before it becomes an operator set AVS. */ - function registerOperatorToAVS( + function createOperatorSets( + uint32[] calldata operatorSetIds + ) external { + for (uint256 i = 0; i < operatorSetIds.length; ++i) { + require(!isOperatorSet[msg.sender][operatorSetIds[i]], InvalidOperatorSet()); + isOperatorSet[msg.sender][operatorSetIds[i]] = true; + emit OperatorSetCreated(OperatorSet({avs: msg.sender, operatorSetId: operatorSetIds[i]})); + } + } + + /** + * @notice Sets the AVS as an operator set AVS, preventing legacy M2 operator registrations. + * + * @dev msg.sender must be the AVS. + */ + function becomeOperatorSetAVS() external { + require(!isOperatorSetAVS[msg.sender], InvalidAVS()); + isOperatorSetAVS[msg.sender] = true; + emit AVSMigratedToOperatorSets(msg.sender); + } + + /** + * @notice Called by an AVS to migrate operators that have a legacy M2 registration to operator sets. + * + * @param operators The list of operators to migrate + * @param operatorSetIds The list of operatorSets to migrate the operators to + * + * @dev The msg.sender used is the AVS + * @dev The operator can only be migrated at most once per AVS + * @dev The AVS can no longer register operators via the legacy M2 registration path once it begins migration + * @dev The operator is deregistered from the M2 legacy AVS once migrated + */ + function migrateOperatorsToOperatorSets( + address[] calldata operators, + uint32[][] calldata operatorSetIds + ) external override onlyWhenNotPaused(PAUSER_OPERATOR_REGISTER_DEREGISTER_TO_OPERATOR_SETS) { + // Assert that the AVS is an operator set AVS. + require(isOperatorSetAVS[msg.sender], InvalidAVS()); + + for (uint256 i = 0; i < operators.length; i++) { + // Assert that the operator is registered & has not been migrated. + require( + avsOperatorStatus[msg.sender][operators[i]] == OperatorAVSRegistrationStatus.REGISTERED, + InvalidOperator() + ); + + // Migrate operator to operator sets. + _registerToOperatorSets(operators[i], msg.sender, operatorSetIds[i]); + + // Deregister operator from AVS - this prevents the operator from being migrated again since + // the AVS can no longer use the legacy M2 registration path + avsOperatorStatus[msg.sender][operators[i]] = OperatorAVSRegistrationStatus.UNREGISTERED; + emit OperatorAVSRegistrationStatusUpdated( + operators[i], msg.sender, OperatorAVSRegistrationStatus.UNREGISTERED + ); + emit OperatorMigratedToOperatorSets(operators[i], msg.sender, operatorSetIds[i]); + } + } + + /** + * @notice Called by AVSs to add an operator to a list of operatorSets. + * + * @param operator The address of the operator to be added to the operator set. + * @param operatorSetIds The IDs of the operator sets. + * @param operatorSignature The signature of the operator on their intent to register. + * + * @dev msg.sender is used as the AVS. + * @dev The operator must not have a pending deregistration from the operator set. + */ + function registerOperatorToOperatorSets( address operator, + uint32[] calldata operatorSetIds, ISignatureUtils.SignatureWithSaltAndExpiry memory operatorSignature - ) external onlyWhenNotPaused(PAUSED_OPERATOR_REGISTER_DEREGISTER_TO_AVS) { - require( - operatorSignature.expiry >= block.timestamp, - "AVSDirectory.registerOperatorToAVS: operator signature expired" - ); - require( - avsOperatorStatus[msg.sender][operator] != OperatorAVSRegistrationStatus.REGISTERED, - "AVSDirectory.registerOperatorToAVS: operator already registered" - ); - require( - !operatorSaltIsSpent[operator][operatorSignature.salt], - "AVSDirectory.registerOperatorToAVS: salt already spent" - ); - require( - delegation.isOperator(operator), - "AVSDirectory.registerOperatorToAVS: operator not registered to EigenLayer yet" - ); - - // Calculate the digest hash - bytes32 operatorRegistrationDigestHash = calculateOperatorAVSRegistrationDigestHash({ - operator: operator, - avs: msg.sender, - salt: operatorSignature.salt, - expiry: operatorSignature.expiry - }); + ) external override onlyWhenNotPaused(PAUSER_OPERATOR_REGISTER_DEREGISTER_TO_OPERATOR_SETS) { + // Assert operator's signature has not expired. + require(operatorSignature.expiry >= block.timestamp, SignatureExpired()); + // Assert `operator` is actually an operator. + require(delegation.isOperator(operator), OperatorNotRegistered()); + // Assert that the AVS is an operator set AVS. + require(isOperatorSetAVS[msg.sender], InvalidAVS()); + // Assert operator's signature `salt` has not already been spent. + require(!operatorSaltIsSpent[operator][operatorSignature.salt], SaltSpent()); - // forgefmt: disable-next-item - // Check that the signature is valid + // Assert that `operatorSignature.signature` is a valid signature for operator set registrations. EIP1271SignatureUtils.checkSignature_EIP1271( - operator, - operatorRegistrationDigestHash, + operator, + calculateOperatorSetRegistrationDigestHash({ + avs: msg.sender, + operatorSetIds: operatorSetIds, + salt: operatorSignature.salt, + expiry: operatorSignature.expiry + }), operatorSignature.signature ); - // Set the operator as registered - avsOperatorStatus[msg.sender][operator] = OperatorAVSRegistrationStatus.REGISTERED; + // Mutate `operatorSaltIsSpent` to `true` to prevent future respending. + operatorSaltIsSpent[operator][operatorSignature.salt] = true; + + _registerToOperatorSets(operator, msg.sender, operatorSetIds); + } + + /** + * @notice Called by an operator to deregister from an operator set + * + * @param operator The operator to deregister from the operatorSets. + * @param avs The address of the AVS to deregister the operator from. + * @param operatorSetIds The IDs of the operator sets. + * @param operatorSignature the signature of the operator on their intent to deregister or empty if the operator itself is calling + * + * @dev if the operatorSignature is empty, the caller must be the operator + * @dev this will likely only be called in case the AVS contracts are in a state that prevents operators from deregistering + */ + function forceDeregisterFromOperatorSets( + address operator, + address avs, + uint32[] calldata operatorSetIds, + ISignatureUtils.SignatureWithSaltAndExpiry memory operatorSignature + ) external override onlyWhenNotPaused(PAUSER_OPERATOR_REGISTER_DEREGISTER_TO_OPERATOR_SETS) { + if (operatorSignature.signature.length == 0) { + require(msg.sender == operator, InvalidOperator()); + } else { + // Assert operator's signature has not expired. + require(operatorSignature.expiry >= block.timestamp, SignatureExpired()); + // Assert operator's signature `salt` has not already been spent. + require(!operatorSaltIsSpent[operator][operatorSignature.salt], SaltSpent()); + + // Assert that `operatorSignature.signature` is a valid signature for operator set deregistrations. + EIP1271SignatureUtils.checkSignature_EIP1271( + operator, + calculateOperatorSetForceDeregistrationTypehash({ + avs: avs, + operatorSetIds: operatorSetIds, + salt: operatorSignature.salt, + expiry: operatorSignature.expiry + }), + operatorSignature.signature + ); + + // Mutate `operatorSaltIsSpent` to `true` to prevent future respending. + operatorSaltIsSpent[operator][operatorSignature.salt] = true; + } + _deregisterFromOperatorSets(avs, operator, operatorSetIds); + } + + /** + * @notice Called by AVSs to remove an operator from an operator set. + * + * @param operator The address of the operator to be removed from the operator set. + * @param operatorSetIds The IDs of the operator sets. + * + * @dev msg.sender is used as the AVS. + */ + function deregisterOperatorFromOperatorSets( + address operator, + uint32[] calldata operatorSetIds + ) external override onlyWhenNotPaused(PAUSER_OPERATOR_REGISTER_DEREGISTER_TO_OPERATOR_SETS) { + _deregisterFromOperatorSets(msg.sender, operator, operatorSetIds); + } + + /** + * @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( + string calldata metadataURI + ) external override { + emit AVSMetadataURIUpdated(msg.sender, metadataURI); + } + + /** + * @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( + bytes32 salt + ) external override { + // Mutate `operatorSaltIsSpent` to `true` to prevent future spending. + operatorSaltIsSpent[msg.sender][salt] = true; + } + + /** + * + * LEGACY EXTERNAL FUNCTIONS - SUPPORT DEPRECATED IN FUTURE RELEASE AFTER SLASHING RELEASE + * + */ + + /** + * @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 `registerOperatorToOperatorSets` 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( + address operator, + ISignatureUtils.SignatureWithSaltAndExpiry memory operatorSignature + ) external override onlyWhenNotPaused(PAUSED_OPERATOR_REGISTER_DEREGISTER_TO_AVS) { + // Assert `operatorSignature.expiry` has not elapsed. + require(operatorSignature.expiry >= block.timestamp, SignatureExpired()); + + // Assert that the AVS is not an operator set AVS. + require(!isOperatorSetAVS[msg.sender], InvalidAVS()); + + // Assert that the `operator` is not actively registered to the AVS. + require(avsOperatorStatus[msg.sender][operator] != OperatorAVSRegistrationStatus.REGISTERED, InvalidOperator()); + + // Assert `operator` has not already spent `operatorSignature.salt`. + require(!operatorSaltIsSpent[operator][operatorSignature.salt], SaltSpent()); + + // Assert `operator` is a registered operator. + require(delegation.isOperator(operator), OperatorNotRegistered()); + + // Assert that `operatorSignature.signature` is a valid signature for the operator AVS registration. + EIP1271SignatureUtils.checkSignature_EIP1271({ + signer: operator, + digestHash: calculateOperatorAVSRegistrationDigestHash({ + operator: operator, + avs: msg.sender, + salt: operatorSignature.salt, + expiry: operatorSignature.expiry + }), + signature: operatorSignature.signature + }); - // Mark the salt as spent + // Mutate `operatorSaltIsSpent` to `true` to prevent future respending. operatorSaltIsSpent[operator][operatorSignature.salt] = true; + // Set the operator as registered + avsOperatorStatus[msg.sender][operator] = OperatorAVSRegistrationStatus.REGISTERED; + emit OperatorAVSRegistrationStatusUpdated(operator, msg.sender, OperatorAVSRegistrationStatus.REGISTERED); } /** - * @notice Called by an avs to deregister an operator with the avs. - * @param operator The address of the operator to deregister. + * @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(address operator) - external - onlyWhenNotPaused(PAUSED_OPERATOR_REGISTER_DEREGISTER_TO_AVS) - { - require( - avsOperatorStatus[msg.sender][operator] == OperatorAVSRegistrationStatus.REGISTERED, - "AVSDirectory.deregisterOperatorFromAVS: operator not registered" - ); + function deregisterOperatorFromAVS( + address operator + ) external override onlyWhenNotPaused(PAUSED_OPERATOR_REGISTER_DEREGISTER_TO_AVS) { + // Assert that operator is registered for the AVS. + require(avsOperatorStatus[msg.sender][operator] == OperatorAVSRegistrationStatus.REGISTERED, InvalidOperator()); + // Assert that the AVS is not an operator set AVS. + require(!isOperatorSetAVS[msg.sender], InvalidAVS()); // Set the operator as deregistered avsOperatorStatus[msg.sender][operator] = OperatorAVSRegistrationStatus.UNREGISTERED; @@ -127,20 +337,61 @@ contract AVSDirectory is } /** - * @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 + * + * INTERNAL FUNCTIONS + * */ - function updateAVSMetadataURI(string calldata metadataURI) external { - emit AVSMetadataURIUpdated(msg.sender, metadataURI); + + /** + * @notice Helper function used by migration & registration functions to register an operator to operator sets. + * @param avs The AVS that the operator is registering to. + * @param operator The operator to register. + * @param operatorSetIds The IDs of the operator sets. + */ + function _registerToOperatorSets(address operator, address avs, uint32[] calldata operatorSetIds) internal { + // Loop over `operatorSetIds` array and register `operator` for each item. + for (uint256 i = 0; i < operatorSetIds.length; ++i) { + OperatorSet memory operatorSet = OperatorSet(avs, operatorSetIds[i]); + + require(isOperatorSet[avs][operatorSetIds[i]], InvalidOperatorSet()); + + bytes32 encodedOperatorSet = _encodeOperatorSet(operatorSet); + + require(_operatorSetsMemberOf[operator].add(encodedOperatorSet), InvalidOperator()); + + _operatorSetMembers[encodedOperatorSet].add(operator); + + OperatorSetRegistrationStatus storage registrationStatus = + operatorSetStatus[avs][operator][operatorSetIds[i]]; + + require(!registrationStatus.registered, InvalidOperator()); + + registrationStatus.registered = true; + + emit OperatorAddedToOperatorSet(operator, operatorSet); + } } /** - * @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. + * @notice Internal function to deregister an operator from an operator set. + * + * @param avs The AVS that the operator is deregistering from. + * @param operator The operator to deregister. + * @param operatorSetIds The IDs of the operator sets. */ - function cancelSalt(bytes32 salt) external { - require(!operatorSaltIsSpent[msg.sender][salt], "AVSDirectory.cancelSalt: cannot cancel spent salt"); - operatorSaltIsSpent[msg.sender][salt] = true; + function _deregisterFromOperatorSets(address avs, address operator, uint32[] calldata operatorSetIds) internal { + // Loop over `operatorSetIds` array and deregister `operator` for each item. + for (uint256 i = 0; i < operatorSetIds.length; ++i) { + OperatorSet memory operatorSet = OperatorSet(avs, operatorSetIds[i]); + + bytes32 encodedOperatorSet = _encodeOperatorSet(operatorSet); + + require(_operatorSetsMemberOf[operator].remove(encodedOperatorSet), InvalidOperator()); + + _operatorSetMembers[encodedOperatorSet].remove(operator); + + emit OperatorRemovedFromOperatorSet(operator, operatorSet); + } } /** @@ -150,39 +401,186 @@ contract AVSDirectory is */ /** - * @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 address of the service manager contract for the AVS that the operator is registering to - * @param salt A unique and single use value associated with the approver signature. - * @param expiry Time after which the approver's signature becomes invalid + * @notice Returns operatorSet an operator is registered to in the order they were registered. + * @param operator The operator address to query. + * @param index The index of the enumerated list of operator sets. + */ + function operatorSetsMemberOfAtIndex(address operator, uint256 index) external view returns (OperatorSet memory) { + return _decodeOperatorSet(_operatorSetsMemberOf[operator].at(index)); + } + + /** + * @notice Returns the operator registered to an operatorSet in the order that it was registered. + * @param operatorSet The operatorSet to query. + * @param index The index of the enumerated list of operators. + */ + function operatorSetMemberAtIndex(OperatorSet memory operatorSet, uint256 index) external view returns (address) { + return _operatorSetMembers[_encodeOperatorSet(operatorSet)].at(index); + } + + /** + * @notice Returns an array of operator sets an operator is registered to. + * @param operator The operator address to query. + * @param start The starting index of the array to query. + * @param length The amount of items of the array to return. + */ + function getOperatorSetsOfOperator( + address operator, + uint256 start, + uint256 length + ) public view returns (OperatorSet[] memory operatorSets) { + uint256 maxLength = _operatorSetsMemberOf[operator].length() - start; + if (length > maxLength) length = maxLength; + operatorSets = new OperatorSet[](length); + for (uint256 i; i < length; ++i) { + operatorSets[i] = _decodeOperatorSet(_operatorSetsMemberOf[operator].at(start + i)); + } + } + + /** + * @notice Returns an array of operators registered to the operatorSet. + * @param operatorSet The operatorSet to query. + * @param start The starting index of the array to query. + * @param length The amount of items of the array to return. + */ + function getOperatorsInOperatorSet( + OperatorSet memory operatorSet, + uint256 start, + uint256 length + ) external view returns (address[] memory operators) { + bytes32 encodedOperatorSet = _encodeOperatorSet(operatorSet); + uint256 maxLength = _operatorSetMembers[encodedOperatorSet].length() - start; + if (length > maxLength) length = maxLength; + operators = new address[](length); + for (uint256 i; i < length; ++i) { + operators[i] = _operatorSetMembers[encodedOperatorSet].at(start + i); + } + } + + /** + * @notice Returns the number of operators registered to an operatorSet. + * @param operatorSet The operatorSet to get the member count for + */ + function getNumOperatorsInOperatorSet( + OperatorSet memory operatorSet + ) external view returns (uint256) { + return _operatorSetMembers[_encodeOperatorSet(operatorSet)].length(); + } + + /** + * @notice Returns the total number of operator sets an operator is registered to. + * @param operator The operator address to query. + */ + function inTotalOperatorSets( + address operator + ) external view returns (uint256) { + return _operatorSetsMemberOf[operator].length(); + } + + /** + * @notice Returns whether or not an operator is registered to an operator set. + * @param operator The operator address to query. + * @param operatorSet The `OperatorSet` to query. + */ + function isMember(address operator, OperatorSet memory operatorSet) public view returns (bool) { + return _operatorSetsMemberOf[operator].contains(_encodeOperatorSet(operatorSet)); + } + + /** + * @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( address operator, address avs, bytes32 salt, uint256 expiry - ) public view returns (bytes32) { - // calculate the struct hash - bytes32 structHash = keccak256(abi.encode(OPERATOR_AVS_REGISTRATION_TYPEHASH, operator, avs, salt, expiry)); - // calculate the digest hash - bytes32 digestHash = keccak256(abi.encodePacked("\x19\x01", domainSeparator(), structHash)); - return digestHash; + ) public view override returns (bytes32) { + return + _calculateDigestHash(keccak256(abi.encode(OPERATOR_AVS_REGISTRATION_TYPEHASH, operator, avs, salt, expiry))); + } + + /** + * @notice Calculates the digest hash to be signed by an operator to register with an operator set. + * + * @param avs The AVS that operator is registering to operator sets for. + * @param operatorSetIds An array of operator set IDs the operator is registering to. + * @param salt A unique and single use value associated with the approver signature. + * @param expiry Time after which the approver's signature becomes invalid. + */ + function calculateOperatorSetRegistrationDigestHash( + address avs, + uint32[] calldata operatorSetIds, + bytes32 salt, + uint256 expiry + ) public view override returns (bytes32) { + return _calculateDigestHash( + keccak256(abi.encode(OPERATOR_SET_REGISTRATION_TYPEHASH, avs, operatorSetIds, salt, expiry)) + ); } /** - * @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. + * @notice Calculates the digest hash to be signed by an operator to force deregister from an operator set. + * + * @param avs The AVS that operator is deregistering from. + * @param operatorSetIds An array of operator set IDs the operator is deregistering from. + * @param salt A unique and single use value associated with the approver signature. + * @param expiry Time after which the approver's signature becomes invalid. */ - function domainSeparator() public view returns (bytes32) { + function calculateOperatorSetForceDeregistrationTypehash( + address avs, + uint32[] calldata operatorSetIds, + bytes32 salt, + uint256 expiry + ) public view returns (bytes32) { + return _calculateDigestHash( + keccak256(abi.encode(OPERATOR_SET_FORCE_DEREGISTRATION_TYPEHASH, avs, operatorSetIds, salt, expiry)) + ); + } + + /// @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() public view override returns (bytes32) { + return _calculateDomainSeparator(); + } + + /// @notice Internal function for calculating the current domain separator of this contract + function _calculateDomainSeparator() internal view returns (bytes32) { if (block.chainid == ORIGINAL_CHAIN_ID) { return _DOMAIN_SEPARATOR; } else { - return _calculateDomainSeparator(); + return keccak256(abi.encode(DOMAIN_TYPEHASH, keccak256(bytes("EigenLayer")), block.chainid, address(this))); } } - // @notice Internal function for calculating the current domain separator of this contract - function _calculateDomainSeparator() internal view returns (bytes32) { - return keccak256(abi.encode(DOMAIN_TYPEHASH, keccak256(bytes("EigenLayer")), block.chainid, address(this))); + /// @notice Returns an EIP-712 encoded hash struct. + function _calculateDigestHash( + bytes32 structHash + ) internal view returns (bytes32) { + return keccak256(abi.encodePacked("\x19\x01", _calculateDomainSeparator(), structHash)); + } + + /// @dev Returns an `OperatorSet` encoded into a 32-byte value. + /// @param operatorSet The `OperatorSet` to encode. + function _encodeOperatorSet( + OperatorSet memory operatorSet + ) internal pure returns (bytes32) { + return bytes32(abi.encodePacked(operatorSet.avs, uint96(operatorSet.operatorSetId))); + } + + /// @dev Returns an `OperatorSet` decoded from an encoded 32-byte value. + /// @param encoded The encoded `OperatorSet` to decode. + /// @dev Assumes `encoded` is encoded via `_encodeOperatorSet(operatorSet)`. + function _decodeOperatorSet( + bytes32 encoded + ) internal pure returns (OperatorSet memory) { + return OperatorSet({ + avs: address(uint160(uint256(encoded) >> 96)), + operatorSetId: uint32(uint256(encoded) & type(uint96).max) + }); } } diff --git a/src/contracts/core/AVSDirectoryStorage.sol b/src/contracts/core/AVSDirectoryStorage.sol index 47a326f16..909b88656 100644 --- a/src/contracts/core/AVSDirectoryStorage.sol +++ b/src/contracts/core/AVSDirectoryStorage.sol @@ -1,10 +1,15 @@ // SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.12; +pragma solidity ^0.8.27; + +import "@openzeppelin/contracts/utils/structs/EnumerableSet.sol"; -import "../interfaces/IAVSDirectory.sol"; import "../interfaces/IDelegationManager.sol"; +import "../interfaces/IAVSDirectory.sol"; abstract contract AVSDirectoryStorage is IAVSDirectory { + using EnumerableSet for EnumerableSet.Bytes32Set; + using EnumerableSet for EnumerableSet.AddressSet; + /// @notice The EIP-712 typehash for the contract's domain bytes32 public constant DOMAIN_TYPEHASH = keccak256("EIP712Domain(string name,uint256 chainId,address verifyingContract)"); @@ -13,6 +18,19 @@ abstract contract AVSDirectoryStorage is IAVSDirectory { bytes32 public constant OPERATOR_AVS_REGISTRATION_TYPEHASH = keccak256("OperatorAVSRegistration(address operator,address avs,bytes32 salt,uint256 expiry)"); + /// @notice The EIP-712 typehash for the `OperatorSetRegistration` struct used by the contract + bytes32 public constant OPERATOR_SET_REGISTRATION_TYPEHASH = + keccak256("OperatorSetRegistration(address avs,uint32[] operatorSetIds,bytes32 salt,uint256 expiry)"); + + /// @notice The EIP-712 typehash for the `OperatorSetMembership` struct used by the contract + bytes32 public constant OPERATOR_SET_FORCE_DEREGISTRATION_TYPEHASH = + keccak256("OperatorSetForceDeregistration(address avs,uint32[] operatorSetIds,bytes32 salt,uint256 expiry)"); + + /// @notice The EIP-712 typehash for the `MagnitudeAdjustments` struct used by the contract + bytes32 public constant MAGNITUDE_ADJUSTMENT_TYPEHASH = keccak256( + "MagnitudeAdjustments(address operator,MagnitudeAdjustment(address strategy, OperatorSet(address avs, uint32 operatorSetId)[], uint64[] magnitudeDiffs)[],bytes32 salt,uint256 expiry)" + ); + /// @notice The DelegationManager contract for EigenLayer IDelegationManager public immutable delegation; @@ -23,14 +41,33 @@ abstract contract AVSDirectoryStorage is IAVSDirectory { */ bytes32 internal _DOMAIN_SEPARATOR; - /// @notice Mapping: AVS => operator => enum of operator status to the AVS + /// @notice Mapping: avs => operator => OperatorAVSRegistrationStatus struct + /// @dev This storage will be deprecated once M2 based deregistration is deprecated. mapping(address => mapping(address => OperatorAVSRegistrationStatus)) public avsOperatorStatus; - /// @notice Mapping: operator => 32-byte salt => whether or not the salt has already been used by the operator. - /// @dev Salt is used in the `registerOperatorToAVS` function. + /// @notice Mapping: operator => salt => Whether the salt has been used or not. mapping(address => mapping(bytes32 => bool)) public operatorSaltIsSpent; - constructor(IDelegationManager _delegation) { + /// @notice Mapping: avs => Whether it is a an operator set AVS or not. + mapping(address => bool) public isOperatorSetAVS; + + /// @notice Mapping: avs => operatorSetId => Whether or not an operator set is valid. + mapping(address => mapping(uint32 => bool)) public isOperatorSet; + + /// @notice Mapping: operator => List of operator sets that operator is registered to. + /// @dev Each item is formatted as such: bytes32(abi.encodePacked(avs, uint96(operatorSetId))) + mapping(address => EnumerableSet.Bytes32Set) internal _operatorSetsMemberOf; + + /// @notice Mapping: operatorSet => List of operators that are registered to the operatorSet + /// @dev Each key is formatted as such: bytes32(abi.encodePacked(avs, uint96(operatorSetId))) + mapping(bytes32 => EnumerableSet.AddressSet) internal _operatorSetMembers; + + /// @notice Mapping: operator => avs => operatorSetId => operator registration status + mapping(address => mapping(address => mapping(uint32 => OperatorSetRegistrationStatus))) public operatorSetStatus; + + constructor( + IDelegationManager _delegation + ) { delegation = _delegation; } @@ -39,5 +76,5 @@ abstract contract AVSDirectoryStorage is IAVSDirectory { * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ - uint256[47] private __gap; + uint256[42] private __gap; } diff --git a/src/contracts/core/AllocationManager.sol b/src/contracts/core/AllocationManager.sol new file mode 100644 index 000000000..18d2b99cf --- /dev/null +++ b/src/contracts/core/AllocationManager.sol @@ -0,0 +1,803 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.27; + +import "@openzeppelin-upgrades/contracts/proxy/utils/Initializable.sol"; +import "@openzeppelin-upgrades/contracts/access/OwnableUpgradeable.sol"; +import "@openzeppelin-upgrades/contracts/security/ReentrancyGuardUpgradeable.sol"; + +import "../permissions/Pausable.sol"; +import "../libraries/EIP1271SignatureUtils.sol"; +import "../libraries/SlashingLib.sol"; +import "./AllocationManagerStorage.sol"; + +contract AllocationManager is + Initializable, + OwnableUpgradeable, + Pausable, + AllocationManagerStorage, + ReentrancyGuardUpgradeable +{ + using Snapshots for Snapshots.History; + + /// @dev BIPS factor for slashable bips + uint256 internal constant BIPS_FACTOR = 10_000; + + /// @dev Maximum number of pending updates that can be queued for allocations/deallocations + /// Note this max applies for a single (operator, strategy, operatorSet) tuple. + uint256 public constant MAX_PENDING_UPDATES = 1; + + /// @dev Returns the chain ID from the time the contract was deployed. + uint256 internal immutable ORIGINAL_CHAIN_ID; + + /** + * + * INITIALIZING FUNCTIONS + * + */ + + /** + * @dev Initializes the immutable addresses of the strategy mananger, delegationManager, slasher, + * and eigenpodManager contracts + */ + constructor( + IDelegationManager _delegation, + IAVSDirectory _avsDirectory, + uint32 _DEALLOCATION_DELAY, + uint32 _ALLOCATION_DELAY_CONFIGURATION_DELAY + ) + AllocationManagerStorage(_delegation, _avsDirectory, _DEALLOCATION_DELAY, _ALLOCATION_DELAY_CONFIGURATION_DELAY) + { + _disableInitializers(); + ORIGINAL_CHAIN_ID = block.chainid; + } + + /** + * @dev Initializes the addresses of the initial owner, pauser registry, and paused status. + * minWithdrawalDelayBlocks is set only once here + */ + function initialize( + address initialOwner, + IPauserRegistry _pauserRegistry, + uint256 initialPausedStatus + ) external initializer { + _initializePauser(_pauserRegistry, initialPausedStatus); + _DOMAIN_SEPARATOR = _calculateDomainSeparator(); + _transferOwnership(initialOwner); + } + + /** + * @notice Called by the delagation manager to set delay when operators register. + * @param operator The operator to set the delay on behalf of. + * @param delay The allocation delay in seconds. + * @dev msg.sender is assumed to be the delegation manager. + */ + function setAllocationDelay(address operator, uint32 delay) external { + require(msg.sender == address(delegation), OnlyDelegationManager()); + _setAllocationDelay(operator, delay); + } + + /** + * @notice Called by operators to set their allocation delay. + * @param delay the allocation delay in seconds + * @dev msg.sender is assumed to be the operator + */ + function setAllocationDelay( + uint32 delay + ) external { + require(delegation.isOperator(msg.sender), OperatorNotRegistered()); + _setAllocationDelay(msg.sender, delay); + } + + /** + * @notice For all pending deallocations that have become completable, their pending free magnitude can be + * added back to the free magnitude of the (operator, strategy) amount. This function takes a list of strategies + * and adds all completable deallocations for each strategy, updating the freeMagnitudes of the operator + * + * @param operator address to complete deallocations for + * @param strategies a list of strategies to complete deallocations for + * @param numToComplete a list of number of pending free magnitude deallocations to complete for each strategy + * + * @dev can be called permissionlessly by anyone + */ + function updateFreeMagnitude( + address operator, + IStrategy[] calldata strategies, + uint16[] calldata numToComplete + ) external { + require(strategies.length == numToComplete.length, InputArrayLengthMismatch()); + require(delegation.isOperator(operator), OperatorNotRegistered()); + for (uint256 i = 0; i < strategies.length; ++i) { + _updateFreeMagnitude({operator: operator, strategy: strategies[i], numToComplete: numToComplete[i]}); + } + } + + /** + * @notice Modifies the propotions of slashable stake allocated to a list of operatorSets for a set of strategies + * @param operator address to modify allocations for + * @param allocations array of magnitude adjustments for multiple strategies and corresponding operator sets + * @param operatorSignature signature of the operator if msg.sender is not the operator + * @dev Updates freeMagnitude for the updated strategies + * @dev Must be called by the operator or with a valid operator signature + * @dev For each allocation, allocation.operatorSets MUST be ordered in ascending order according to the + * encoding of the operatorSet. This is to prevent duplicate operatorSets being passed in. The easiest way to ensure + * ordering is to sort allocated operatorSets by address first, and then sort for each avs by ascending operatorSetIds. + */ + function modifyAllocations( + address operator, + MagnitudeAllocation[] calldata allocations, + SignatureWithSaltAndExpiry calldata operatorSignature + ) external { + if (msg.sender != operator) { + _verifyOperatorSignature(operator, allocations, operatorSignature); + } + require(delegation.isOperator(operator), OperatorNotRegistered()); + + (bool isSet, uint32 delay) = allocationDelay(operator); + require(isSet, UninitializedAllocationDelay()); + + // effect timestamp for allocations to take effect. This is configurable by operators + uint32 allocationEffectTimestamp = uint32(block.timestamp) + delay; + // completable timestamp for deallocations + uint32 deallocationCompletableTimestamp = uint32(block.timestamp) + DEALLOCATION_DELAY; + + for (uint256 i = 0; i < allocations.length; ++i) { + // 1. For the given (operator,strategy) clear all pending free magnitude for the strategy and update freeMagnitude + _updateFreeMagnitude({ + operator: operator, + strategy: allocations[i].strategy, + numToComplete: type(uint16).max + }); + + // 2. Check current totalMagnitude matches expected value. This is to check for slashing race conditions + // where an operator gets slashed from an operatorSet and as a result all the configured allocations have larger + // proprtional magnitudes relative to each other. + uint64 currentTotalMagnitude = _getLatestTotalMagnitude(operator, allocations[i].strategy); + require(currentTotalMagnitude == allocations[i].expectedTotalMagnitude, InvalidExpectedTotalMagnitude()); + + // 3. set allocations for the strategy after updating freeMagnitude + _modifyAllocations({ + operator: operator, + allocation: allocations[i], + allocationEffectTimestamp: allocationEffectTimestamp, + deallocationCompletableTimestamp: deallocationCompletableTimestamp + }); + } + } + + /** + * @notice Called by an AVS to slash an operator for given operatorSetId, list of strategies, and bipsToSlash. + * For each given (operator, operatorSetId, strategy) tuple, bipsToSlash + * bips of the operatorSet's slashable stake allocation will be slashed + * + * @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 bipsToSlash the number of bips to slash, this will be proportional to the + * operator's slashable stake allocation for the operatorSet + */ + function slashOperator( + address operator, + uint32 operatorSetId, + IStrategy[] calldata strategies, + uint16 bipsToSlash + ) external { + OperatorSet memory operatorSet = OperatorSet({avs: msg.sender, operatorSetId: operatorSetId}); + bytes32 operatorSetKey = _encodeOperatorSet(operatorSet); + require(isOperatorSlashable(operator, operatorSet), InvalidOperator()); + + for (uint256 i = 0; i < strategies.length; ++i) { + // 1. slash the actively allocated (not pending deallocation) magnitude + uint64 slashedMagnitude; + { + Snapshots.History storage magnitudeUpdates = _magnitudeUpdate[operator][strategies[i]][operatorSetKey]; + uint64 currentMagnitude = uint64(magnitudeUpdates.upperLookupRecent(uint32(block.timestamp))); + // skip if no actively allocated magnitude to slash + if (currentMagnitude != 0) { + /// TODO: add wrapping library for rounding up for slashing accounting + slashedMagnitude = uint64(uint256(bipsToSlash) * uint256(currentMagnitude) / BIPS_FACTOR); + + // propagate slashing to current and future and allocations for the (operator, strategy, operatorSet) + magnitudeUpdates.decrementAtAndFutureSnapshots({ + key: uint32(block.timestamp), + decrementValue: slashedMagnitude + }); + } + } + + // 2. slash all pending deallocations that. pending deallocations are deallocations that are not completable yet + { + uint256 queuedDeallocationIndicesLen = + _queuedDeallocationIndices[operator][strategies[i]][operatorSetKey].length; + for (uint256 j = queuedDeallocationIndicesLen; j > 0; --j) { + // index of pendingFreeMagnitude/deallocation to check for slashing + uint256 index = _queuedDeallocationIndices[operator][strategies[i]][operatorSetKey][j - 1]; + PendingFreeMagnitude storage pendingFreeMagnitude = + _pendingFreeMagnitude[operator][strategies[i]][index]; + + // Reached deallocation that is completable and, therefore, not slashable, + // therefore older deallocations will also be completable. Since this is ordered by completableTimestamps break loop now + if (block.timestamp >= pendingFreeMagnitude.completableTimestamp) { + break; + } + + // slash the pending deallocation proportionally and store the updated magnitudeDiff + uint64 slashedAmount = + uint64(uint256(bipsToSlash) * uint256(pendingFreeMagnitude.magnitudeDiff) / BIPS_FACTOR); + pendingFreeMagnitude.magnitudeDiff -= slashedAmount; + // keep track of total slashed magnitude + slashedMagnitude += slashedAmount; + } + } + + // 3. update totalMagnitude, get total magnitude and subtract slashedMagnitude + // this will be reflected in the conversion of delegatedShares to shares in the DM + Snapshots.History storage totalMagnitudes = _totalMagnitudeUpdate[operator][strategies[i]]; + totalMagnitudes.push({key: uint32(block.timestamp), value: totalMagnitudes.latest() - slashedMagnitude}); + } + } + + /** + * @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( + bytes32 salt + ) external override { + // Mutate `operatorSaltIsSpent` to `true` to prevent future spending. + operatorSaltIsSpent[msg.sender][salt] = true; + } + + /** + * @notice Helper for setting an operators allocation delay. + * @param operator The operator to set the delay on behalf of. + * @param delay The allocation delay in seconds. + */ + function _setAllocationDelay(address operator, uint32 delay) internal { + require(delay != 0, InvalidDelay()); + + AllocationDelayInfo storage delayInfo = _allocationDelayInfo[operator]; + + bool pendingInEffect = delayInfo.pendingDelay != 0 && block.timestamp >= delayInfo.pendingDelayEffectTimestamp; + + if (pendingInEffect) { + delayInfo.delay = delayInfo.pendingDelay; + } + + delayInfo.pendingDelay = delay; + delayInfo.pendingDelayEffectTimestamp = uint32(block.timestamp + ALLOCATION_DELAY_CONFIGURATION_DELAY); + + emit AllocationDelaySet(operator, delay); + } + + /** + * @notice For a single strategy, update freeMagnitude by adding completable pending free magnitudes + * @param operator address to update freeMagnitude for + * @param strategy the strategy to update freeMagnitude for + * @param numToComplete the number of pending free magnitudes deallocations to complete + * @dev read through pending free magnitudes and add to freeMagnitude if completableTimestamp is >= block timestamp + * In addition to updating freeMagnitude, updates next starting index to read from for pending free magnitudes after completing + */ + function _updateFreeMagnitude(address operator, IStrategy strategy, uint16 numToComplete) internal { + OperatorMagnitudeInfo storage info = operatorMagnitudeInfo[operator][strategy]; + (uint64 freeMagnitudeToAdd, uint192 completed) = + _getPendingFreeMagnitude(operator, strategy, numToComplete, info.nextPendingFreeMagnitudeIndex); + info.freeMagnitude += freeMagnitudeToAdd; + info.nextPendingFreeMagnitudeIndex += completed; + } + + /** + * @notice For a single strategy, modify magnitude allocations for each of the specified operatorSets + * @param operator address to modify allocations for + * @param allocation the magnitude allocations to modify for a single strategy + * @param allocationEffectTimestamp the timestamp when the allocations will take effect + * @param deallocationCompletableTimestamp the timestamp when the deallocations will be completable + * @dev For each allocation, allocation.operatorSets MUST be ordered in ascending order according to the + * encoding of the operatorSet. This is to prevent duplicate operatorSets being passed in. The easiest way to ensure + * ordering is to sort allocated operatorSets by address first, and then sort for each avs by ascending operatorSetIds. + */ + function _modifyAllocations( + address operator, + MagnitudeAllocation calldata allocation, + uint32 allocationEffectTimestamp, + uint32 deallocationCompletableTimestamp + ) internal { + require(allocation.operatorSets.length == allocation.magnitudes.length, InputArrayLengthMismatch()); + + // OperatorSet[] calldata opSets = allocation.operatorSets; + + for (uint256 i = 0; i < allocation.operatorSets.length; ++i) { + require( + avsDirectory.isOperatorSet(allocation.operatorSets[i].avs, allocation.operatorSets[i].operatorSetId), + InvalidOperatorSet() + ); + + bytes32 operatorSetKey = _encodeOperatorSet(allocation.operatorSets[i]); + // prep magnitudeUpdates in storage + Snapshots.History storage magnitudeUpdates = _magnitudeUpdate[operator][allocation.strategy][operatorSetKey]; + + // Read current magnitude allocation including its respective array index and length. + // We'll use these values later to check the number of pending allocations/deallocations. + (uint224 currentMagnitude, uint256 pos, uint256 length) = + magnitudeUpdates.upperLookupRecentWithPos(uint32(block.timestamp)); + require(currentMagnitude != allocation.magnitudes[i], SameMagnitude()); + + // Check that there is at MOST `MAX_PENDING_UPDATES` combined allocations & deallocations for the operator, operatorSet, strategy + { + uint256 numPendingAllocations; + // if no lookup found (currentMagnitude == 0 && pos == 0), then there were no allocaitons at + // or before the current timestamp: the number of pending allocations is simply length + if (currentMagnitude == 0 && pos == 0) { + numPendingAllocations = length; + } else { + // if lookup found, then we take the difference between length-1 and pos + numPendingAllocations = length - 1 - pos; + } + + uint256 numPendingDeallocations = + _getNumQueuedDeallocations(operator, allocation.strategy, operatorSetKey); + + require( + numPendingAllocations + numPendingDeallocations < MAX_PENDING_UPDATES, + PendingAllocationOrDeallocation() + ); + } + + if (allocation.magnitudes[i] < uint64(currentMagnitude)) { + // Newly configured magnitude is less than current value. + // Therefore we handle this as a deallocation + + // Note: MAX_PENDING_UPDATES == 1, so we do not have to decrement any allocations + + // 1. push PendingFreeMagnitude and respective array index into (op,opSet,Strategy) queued deallocations + uint64 magnitudeToDeallocate = uint64(currentMagnitude) - allocation.magnitudes[i]; + _queuedDeallocationIndices[operator][allocation.strategy][operatorSetKey].push( + _pendingFreeMagnitude[operator][allocation.strategy].length + ); + _pendingFreeMagnitude[operator][allocation.strategy].push( + PendingFreeMagnitude({ + magnitudeDiff: magnitudeToDeallocate, + completableTimestamp: deallocationCompletableTimestamp + }) + ); + + // 2. decrement allocated magnitude + magnitudeUpdates.decrementAtAndFutureSnapshots({ + key: uint32(block.timestamp), + decrementValue: magnitudeToDeallocate + }); + } else if (allocation.magnitudes[i] > uint64(currentMagnitude)) { + // Newly configured magnitude is greater than current value. + // Therefore we handle this as an allocation + + // 1. decrement free magnitude by incremented amount + uint64 magnitudeToAllocate = allocation.magnitudes[i] - uint64(currentMagnitude); + OperatorMagnitudeInfo storage info = operatorMagnitudeInfo[operator][allocation.strategy]; + require(info.freeMagnitude >= magnitudeToAllocate, InsufficientAllocatableMagnitude()); + info.freeMagnitude -= magnitudeToAllocate; + + // 2. allocate magnitude which will take effect in the future 21 days from now + magnitudeUpdates.push({key: allocationEffectTimestamp, value: allocation.magnitudes[i]}); + } + } + } + + /** + * @notice Get the number of queued dealloations for the given (operator, strategy, operatorSetKey) tuple + * @param operator address to get queued deallocations for + * @param strategy the strategy to get queued deallocations for + * @param operatorSetKey the encoded operatorSet to get queued deallocations for + */ + function _getNumQueuedDeallocations( + address operator, + IStrategy strategy, + bytes32 operatorSetKey + ) internal view returns (uint256) { + uint256 numQueuedDeallocations; + + uint256 length = _queuedDeallocationIndices[operator][strategy][operatorSetKey].length; + for (uint256 i = length; i > 0; --i) { + // index of pendingFreeMagnitude/deallocation to check for slashing + uint256 index = _queuedDeallocationIndices[operator][strategy][operatorSetKey][i - 1]; + + // If completableTimestamp is greater than completeUntilTimestamp, break + if (block.timestamp < _pendingFreeMagnitude[operator][strategy][index].completableTimestamp) { + ++numQueuedDeallocations; + } else { + break; + } + } + + return numQueuedDeallocations; + } + + /// @dev gets the latest total magnitude or overwrites it if it is not set + function _getLatestTotalMagnitude(address operator, IStrategy strategy) internal returns (uint64) { + (bool exists,, uint224 totalMagnitude) = _totalMagnitudeUpdate[operator][strategy].latestSnapshot(); + if (!exists) { + totalMagnitude = WAD; + _totalMagnitudeUpdate[operator][strategy].push({key: uint32(block.timestamp), value: totalMagnitude}); + operatorMagnitudeInfo[operator][strategy].freeMagnitude = WAD; + } + + return uint64(totalMagnitude); + } + + /// @dev gets the latest total magnitude + function _getLatestTotalMagnitudeView(address operator, IStrategy strategy) internal view returns (uint64) { + (bool exists,, uint224 totalMagnitude) = _totalMagnitudeUpdate[operator][strategy].latestSnapshot(); + if (!exists) { + totalMagnitude = WAD; + } + + return uint64(totalMagnitude); + } + + function _getTotalAndAllocatedMagnitude( + address operator, + OperatorSet calldata operatorSet, + IStrategy strategy + ) internal view returns (uint64, uint64) { + uint64 totalMagnitude = _getLatestTotalMagnitudeView(operator, strategy); + + bytes32 operatorSetKey = _encodeOperatorSet(operatorSet); + uint64 currentMagnitude = + uint64(_magnitudeUpdate[operator][strategy][operatorSetKey].upperLookupLinear(uint32(block.timestamp))); + + return (totalMagnitude, currentMagnitude); + } + + /// @dev gets the pending free magnitude available to add by completing numToComplete pending deallocations + /// and returns the next index to start from if completed. + function _getPendingFreeMagnitude( + address operator, + IStrategy strategy, + uint16 numToComplete, + uint192 nextIndex + ) internal view returns (uint64 freeMagnitudeToAdd, uint192 completed) { + uint256 pendingFreeMagnitudeLength = _pendingFreeMagnitude[operator][strategy].length; + freeMagnitudeToAdd = 0; + while (nextIndex < pendingFreeMagnitudeLength && completed < numToComplete) { + PendingFreeMagnitude memory pendingFreeMagnitude = _pendingFreeMagnitude[operator][strategy][nextIndex]; + // pendingFreeMagnitude is ordered by completableTimestamp. If we reach one that is not completable yet, then break + // loop until completableTimestamp is < block.timestamp + if (block.timestamp < pendingFreeMagnitude.completableTimestamp) { + break; + } + + // pending free magnitude can be added to freeMagnitude + freeMagnitudeToAdd += pendingFreeMagnitude.magnitudeDiff; + ++nextIndex; + ++completed; + } + return (freeMagnitudeToAdd, completed); + } + + /** + * @notice Returns the allocation delay of an operator + * @param operator The operator to get the allocation delay for + */ + function allocationDelay( + address operator + ) public view returns (bool isSet, uint32 delay) { + AllocationDelayInfo memory delayInfo = _allocationDelayInfo[operator]; + + bool pendingInEffect = delayInfo.pendingDelay != 0 && block.timestamp >= delayInfo.pendingDelayEffectTimestamp; + + isSet = delayInfo.delay != 0 || pendingInEffect; + + if (pendingInEffect) return (isSet, delayInfo.pendingDelay); + + return (isSet, delayInfo.delay); + } + + /** + * @param operator the operator to get the slashable magnitude for + * @param strategies the strategies to get the slashable magnitude for + * + * @return operatorSets the operator sets the operator is a member of and the current slashable magnitudes for each strategy + */ + function getSlashableMagnitudes( + address operator, + IStrategy[] calldata strategies + ) external view returns (OperatorSet[] memory, uint64[][] memory) { + OperatorSet[] memory operatorSets = avsDirectory.getOperatorSetsOfOperator(operator, 0, type(uint256).max); + uint64[][] memory slashableMagnitudes = new uint64[][](strategies.length); + for (uint256 i = 0; i < strategies.length; ++i) { + slashableMagnitudes[i] = new uint64[](operatorSets.length); + for (uint256 j = 0; j < operatorSets.length; ++j) { + slashableMagnitudes[i][j] = uint64( + _magnitudeUpdate[operator][strategies[i]][_encodeOperatorSet(operatorSets[j])].upperLookupLinear( + uint32(block.timestamp) + ) + ); + } + } + return (operatorSets, slashableMagnitudes); + } + + /** + * @notice Get the allocatable magnitude for an operator and strategy based on number of pending deallocations + * that could be completed at the same time. This is the sum of freeMagnitude and the sum of all pending completable deallocations. + * @param operator the operator to get the allocatable magnitude for + * @param strategy the strategy to get the allocatable magnitude for + */ + function getAllocatableMagnitude(address operator, IStrategy strategy) external view returns (uint64) { + OperatorMagnitudeInfo storage info = operatorMagnitudeInfo[operator][strategy]; + (uint64 freeMagnitudeToAdd,) = _getPendingFreeMagnitude({ + operator: operator, + strategy: strategy, + numToComplete: type(uint16).max, + nextIndex: info.nextPendingFreeMagnitudeIndex + }); + return info.freeMagnitude + freeMagnitudeToAdd; + } + + /// @notice operator is slashable by operatorSet if currently registered OR last deregistered within 21 days + function isOperatorSlashable(address operator, OperatorSet memory operatorSet) public view returns (bool) { + bool isMember = avsDirectory.isMember(operator, operatorSet); + if (isMember) { + return true; + } + (, uint32 lastDeregisteredTimestamp) = + avsDirectory.operatorSetStatus(operatorSet.avs, operator, operatorSet.operatorSetId); + return block.timestamp < lastDeregisteredTimestamp + DEALLOCATION_DELAY; + } + + /** + * @notice Returns the current total magnitudes of an operator for a given set of strategies + * @param operator the operator to get the total magnitude for + * @param strategies the strategies to get the total magnitudes for + * @return totalMagnitudes the total magnitudes for each strategy + */ + function getTotalMagnitudes( + address operator, + IStrategy[] calldata strategies + ) external view returns (uint64[] memory) { + uint64[] memory totalMagnitudes = new uint64[](strategies.length); + for (uint256 i = 0; i < strategies.length; ++i) { + (bool exists,, uint224 value) = _totalMagnitudeUpdate[operator][strategies[i]].latestSnapshot(); + if (!exists) { + totalMagnitudes[i] = WAD; + } else { + totalMagnitudes[i] = uint64(value); + } + } + return totalMagnitudes; + } + + /** + * @notice Returns the total magnitudes of an operator for a given set of strategies at a given timestamp + * @param operator the operator to get the total magnitude for + * @param strategies the strategies to get the total magnitudes for + * @param timestamp the timestamp to get the total magnitudes at + * @return totalMagnitudes the total magnitudes for each strategy + */ + function getTotalMagnitudesAtTimestamp( + address operator, + IStrategy[] calldata strategies, + uint32 timestamp + ) external view returns (uint64[] memory) { + uint64[] memory totalMagnitudes = new uint64[](strategies.length); + for (uint256 i = 0; i < strategies.length; ++i) { + (uint224 value, uint256 pos) = _totalMagnitudeUpdate[operator][strategies[i]].upperLookupWithPos(timestamp); + // if there is no existing total magnitude snapshot + if (value == 0 && pos == 0) { + totalMagnitudes[i] = WAD; + } else { + totalMagnitudes[i] = uint64(value); + } + } + return totalMagnitudes; + } + + /** + * @notice Returns the current total magnitude of an operator for a given strategy + * @param operator the operator to get the total magnitude for + * @param strategy the strategy to get the total magnitude for + * @return totalMagnitude the total magnitude for the strategy + */ + function getTotalMagnitude(address operator, IStrategy strategy) external view returns (uint64) { + uint64 totalMagnitude; + (bool exists,, uint224 value) = _totalMagnitudeUpdate[operator][strategy].latestSnapshot(); + if (!exists) { + totalMagnitude = WAD; + } else { + totalMagnitude = uint64(value); + } + + return totalMagnitude; + } + + /** + * @notice Returns the total magnitude of an operator for a given strategy at a given timestamp + * @param operator the operator to get the total magnitude for + * @param strategy the strategy to get the total magnitude for + * @param timestamp the timestamp to get the total magnitude at + * @return totalMagnitude the total magnitude for the strategy + */ + function getTotalMagnitudeAtTimestamp( + address operator, + IStrategy strategy, + uint32 timestamp + ) external view returns (uint64) { + uint64 totalMagnitude = WAD; + (uint224 value, uint256 pos,) = _totalMagnitudeUpdate[operator][strategy].upperLookupRecentWithPos(timestamp); + + // if there is no existing total magnitude snapshot + if (value == 0 && pos == 0) { + totalMagnitude = WAD; + } else { + totalMagnitude = uint64(value); + } + + return totalMagnitude; + } + + /** + * @param operator the operator to get the total and allocated magnitudes for + * @param operatorSet the operatorSet to get the total and allocated magnitudes for + * @param strategies the strategies to get the total and allocated magnitudes for + * + * @return the list of total magnitudes for each strategy and the list of allocated magnitudes for each strategy + */ + function getTotalAndAllocatedMagnitudes( + address operator, + OperatorSet calldata operatorSet, + IStrategy[] calldata strategies + ) external view returns (uint64[] memory, uint64[] memory) { + uint64[] memory totalMagnitude = new uint64[](strategies.length); + uint64[] memory allocatedMagnitude = new uint64[](strategies.length); + for (uint256 i = 0; i < strategies.length; ++i) { + (totalMagnitude[i], allocatedMagnitude[i]) = + _getTotalAndAllocatedMagnitude(operator, operatorSet, strategies[i]); + } + return (totalMagnitude, allocatedMagnitude); + } + + /** + * @notice Returns the latest pending allocation of an operator for a given strategy and operatorSets. + * One of the assumptions here is we don't allow more than one pending allocation for an operatorSet at a time. + * If that changes, we would need to change this function to return all pending allocations for an operatorSet. + * @param operator the operator to get the pending allocations for + * @param strategy the strategy to get the pending allocations for + * @param operatorSets the operatorSets to get the pending allocations for + * @return pendingMagnitude the pending allocations for each operatorSet + * @return timestamps the timestamps for each pending allocation + */ + function getPendingAllocations( + address operator, + IStrategy strategy, + OperatorSet[] calldata operatorSets + ) external view returns (uint64[] memory, uint32[] memory) { + uint64[] memory pendingMagnitude = new uint64[](operatorSets.length); + uint32[] memory timestamps = new uint32[](operatorSets.length); + for (uint256 i = 0; i < operatorSets.length; ++i) { + // We use latestSnapshot to get the latest pending allocation for an operatorSet. + (bool exists, uint32 key, uint224 value) = + _magnitudeUpdate[operator][strategy][_encodeOperatorSet(operatorSets[i])].latestSnapshot(); + if (exists) { + if (key > block.timestamp) { + pendingMagnitude[i] = uint64(value); + timestamps[i] = key; + } else { + pendingMagnitude[i] = 0; + timestamps[i] = 0; + } + } + } + return (pendingMagnitude, timestamps); + } + + /** + * @notice Returns the pending deallocations of an operator for a given strategy and operatorSets. + * One of the assumptions here is we don't allow more than one pending deallocation for an operatorSet at a time. + * If that changes, we would need to change this function to return all pending deallocations for an operatorSet. + * @param operator the operator to get the pending deallocations for + * @param strategy the strategy to get the pending deallocations for + * @param operatorSets the operatorSets to get the pending deallocations for + * @return pendingMagnitudes the latest pending deallocation + */ + function getPendingDeallocations( + address operator, + IStrategy strategy, + OperatorSet[] calldata operatorSets + ) external view returns (PendingFreeMagnitude[] memory) { + PendingFreeMagnitude[] memory pendingMagnitudes = new PendingFreeMagnitude[](operatorSets.length); + for (uint256 i = 0; i < operatorSets.length; ++i) { + uint256[] storage deallocationIndices = + _queuedDeallocationIndices[operator][strategy][_encodeOperatorSet(operatorSets[i])]; + + if (deallocationIndices.length > 0) { + uint256 deallocationIndex = deallocationIndices[deallocationIndices.length - 1]; + PendingFreeMagnitude storage latestPendingMagnitude = + _pendingFreeMagnitude[operator][strategy][deallocationIndex]; + if (latestPendingMagnitude.completableTimestamp > block.timestamp) { + pendingMagnitudes[i] = latestPendingMagnitude; + } + } + } + return pendingMagnitudes; + } + + /// @dev Verify operator's signature and spend salt + function _verifyOperatorSignature( + address operator, + MagnitudeAllocation[] calldata allocations, + SignatureWithSaltAndExpiry calldata operatorSignature + ) internal { + // check the signature expiry + require(operatorSignature.expiry >= block.timestamp, SignatureExpired()); + // Assert operator's signature cannot be replayed. + require(!avsDirectory.operatorSaltIsSpent(operator, operatorSignature.salt), SaltSpent()); + + bytes32 digestHash = calculateMagnitudeAllocationDigestHash( + operator, allocations, operatorSignature.salt, operatorSignature.expiry + ); + + // Assert operator's signature is valid. + EIP1271SignatureUtils.checkSignature_EIP1271(operator, digestHash, operatorSignature.signature); + // Spend salt. + operatorSaltIsSpent[operator][operatorSignature.salt] = true; + } + + /** + * @notice Calculates the digest hash to be signed by an operator to modify magnitude allocations + * @param operator The operator to allocate or deallocate magnitude for. + * @param allocations The magnitude allocations/deallocations to be made. + * @param salt A unique and single use value associated with the approver signature. + * @param expiry Time after which the approver's signature becomes invalid. + */ + function calculateMagnitudeAllocationDigestHash( + address operator, + MagnitudeAllocation[] calldata allocations, + bytes32 salt, + uint256 expiry + ) public view returns (bytes32) { + return _calculateDigestHash( + keccak256(abi.encode(MAGNITUDE_ADJUSTMENT_TYPEHASH, operator, allocations, salt, expiry)) + ); + } + + /// @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() public view override returns (bytes32) { + return _calculateDomainSeparator(); + } + + /// @notice Internal function for calculating the current domain separator of this contract + function _calculateDomainSeparator() internal view returns (bytes32) { + if (block.chainid == ORIGINAL_CHAIN_ID) { + return _DOMAIN_SEPARATOR; + } else { + return keccak256(abi.encode(DOMAIN_TYPEHASH, keccak256(bytes("EigenLayer")), block.chainid, address(this))); + } + } + + /// @notice Returns an EIP-712 encoded hash struct. + function _calculateDigestHash( + bytes32 structHash + ) internal view returns (bytes32) { + return keccak256(abi.encodePacked("\x19\x01", _calculateDomainSeparator(), structHash)); + } + + /// @dev Returns an `OperatorSet` encoded into a 32-byte value. + /// @param operatorSet The `OperatorSet` to encode. + function _encodeOperatorSet( + OperatorSet memory operatorSet + ) internal pure returns (bytes32) { + return bytes32(abi.encodePacked(operatorSet.avs, uint96(operatorSet.operatorSetId))); + } + + /// @dev Returns an `OperatorSet` decoded from an encoded 32-byte value. + /// @param encoded The encoded `OperatorSet` to decode. + /// @dev Assumes `encoded` is encoded via `_encodeOperatorSet(operatorSet)`. + function _decodeOperatorSet( + bytes32 encoded + ) internal pure returns (OperatorSet memory) { + return OperatorSet({ + avs: address(uint160(uint256(encoded) >> 96)), + operatorSetId: uint32(uint256(encoded) & type(uint96).max) + }); + } +} diff --git a/src/contracts/core/AllocationManagerStorage.sol b/src/contracts/core/AllocationManagerStorage.sol new file mode 100644 index 000000000..8abe6a3a1 --- /dev/null +++ b/src/contracts/core/AllocationManagerStorage.sol @@ -0,0 +1,82 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.27; + +import "../interfaces/IAVSDirectory.sol"; +import "../interfaces/IAllocationManager.sol"; +import "../interfaces/IDelegationManager.sol"; +import {Snapshots} from "../libraries/Snapshots.sol"; + +abstract contract AllocationManagerStorage is IAllocationManager { + using Snapshots for Snapshots.History; + + /// @notice The EIP-712 typehash for the contract's domain + bytes32 public constant DOMAIN_TYPEHASH = + keccak256("EIP712Domain(string name,uint256 chainId,address verifyingContract)"); + + /// @notice The EIP-712 typehash for the `MagnitudeAdjustments` struct used by the contract + bytes32 public constant MAGNITUDE_ADJUSTMENT_TYPEHASH = keccak256( + "MagnitudeAdjustments(address operator,MagnitudeAdjustment(address strategy, OperatorSet(address avs, uint32 operatorSetId)[], uint64[] magnitudeDiffs)[],bytes32 salt,uint256 expiry)" + ); + + /// @notice The DelegationManager contract for EigenLayer + IDelegationManager public immutable delegation; + + /// @notice The AVSDirectory contract for EigenLayer + IAVSDirectory public immutable avsDirectory; + + /// @notice Delay before deallocations are completable and can be added back into freeMagnitude + /// In this window, deallocations still remain slashable by the operatorSet they were allocated to. + uint32 public immutable DEALLOCATION_DELAY; + + /// @dev Delay before alloaction delay modifications take effect. + uint32 public immutable ALLOCATION_DELAY_CONFIGURATION_DELAY; // QUESTION: 21 days? + + /** + * @notice Original EIP-712 Domain separator for this contract. + * @dev The domain separator may change in the event of a fork that modifies the ChainID. + * Use the getter function `domainSeparator` to get the current domain separator for this contract. + */ + bytes32 internal _DOMAIN_SEPARATOR; + + /// @notice Mapping: operator => salt => Whether the salt has been used or not. + mapping(address => mapping(bytes32 => bool)) public operatorSaltIsSpent; + + /// @notice Mapping: operator => strategy => snapshotted totalMagnitude + /// Note that totalMagnitude is monotonically decreasing and only gets updated upon slashing + mapping(address => mapping(IStrategy => Snapshots.History)) internal _totalMagnitudeUpdate; + + /// @notice Mapping: operator => strategy => operatorSet (encoded) => snapshotted magnitude + mapping(address => mapping(IStrategy => mapping(bytes32 => Snapshots.History))) internal _magnitudeUpdate; + + /// @notice Mapping: operator => strategy => OperatorMagnitudeInfo to keep track of info regarding pending magnitude allocations. + mapping(address => mapping(IStrategy => OperatorMagnitudeInfo)) public operatorMagnitudeInfo; + + /// @notice Mapping: operator => strategy => PendingFreeMagnitude[] to keep track of pending free magnitude from deallocations + mapping(address => mapping(IStrategy => PendingFreeMagnitude[])) internal _pendingFreeMagnitude; + + /// @notice Mapping: operator => strategy => operatorSet (encoded) => list of queuedDeallocation indices + mapping(address => mapping(IStrategy => mapping(bytes32 => uint256[]))) internal _queuedDeallocationIndices; + + /// @notice Mapping: operator => allocation delay (in seconds) for the operator. + /// This determines how long it takes for allocations to take effect in the future. + mapping(address => AllocationDelayInfo) internal _allocationDelayInfo; + + constructor( + IDelegationManager _delegation, + IAVSDirectory _avsDirectory, + uint32 _DEALLOCATION_DELAY, + uint32 _ALLOCATION_DELAY_CONFIGURATION_DELAY + ) { + delegation = _delegation; + avsDirectory = _avsDirectory; + DEALLOCATION_DELAY = _DEALLOCATION_DELAY; + ALLOCATION_DELAY_CONFIGURATION_DELAY = _ALLOCATION_DELAY_CONFIGURATION_DELAY; + } + + /** + * @dev This empty reserved space is put in place to allow future versions to add new + * variables without shifting down storage in the inheritance chain. + * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps + */ + uint256[42] private __gap; +} diff --git a/src/contracts/core/DelegationManager.sol b/src/contracts/core/DelegationManager.sol index d4d12091a..6626d2571 100644 --- a/src/contracts/core/DelegationManager.sol +++ b/src/contracts/core/DelegationManager.sol @@ -1,11 +1,12 @@ // SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.12; +pragma solidity ^0.8.27; import "@openzeppelin-upgrades/contracts/proxy/utils/Initializable.sol"; import "@openzeppelin-upgrades/contracts/access/OwnableUpgradeable.sol"; import "@openzeppelin-upgrades/contracts/security/ReentrancyGuardUpgradeable.sol"; import "../permissions/Pausable.sol"; import "../libraries/EIP1271SignatureUtils.sol"; +import "../libraries/SlashingLib.sol"; import "./DelegationManagerStorage.sol"; /** @@ -25,6 +26,8 @@ contract DelegationManager is DelegationManagerStorage, ReentrancyGuardUpgradeable { + using SlashingLib for *; + // @dev Index for flag that pauses new delegations when set uint8 internal constant PAUSED_NEW_DELEGATION = 0; @@ -37,8 +40,12 @@ contract DelegationManager is // @dev Chain ID at the time of contract deployment uint256 internal immutable ORIGINAL_CHAIN_ID; - // @dev Maximum Value for `stakerOptOutWindowBlocks`. Approximately equivalent to 6 months in blocks. - uint256 public constant MAX_STAKER_OPT_OUT_WINDOW_BLOCKS = (180 days) / 12; + /// @dev The minimum number of blocks to complete a withdrawal of a strategy. 50400 * 12 seconds = 1 week + uint256 public constant LEGACY_MIN_WITHDRAWAL_DELAY_BLOCKS = 50_400; + + /// @dev Wed Jan 01 2025 17:00:00 GMT+0000, timestamp used to check whether a pending withdrawal + /// should be processed as legacy M2 or with slashing considered. + uint32 public constant LEGACY_WITHDRAWALS_TIMESTAMP = 1_735_750_800; /// @notice Canonical, virtual beacon chain ETH strategy IStrategy public constant beaconChainETHStrategy = IStrategy(0xbeaC0eeEeeeeEEeEeEEEEeeEEeEeeeEeeEEBEaC0); @@ -46,8 +53,8 @@ contract DelegationManager is // @notice Simple permission for functions that are only callable by the StrategyManager contract OR by the EigenPodManagerContract modifier onlyStrategyManagerOrEigenPodManager() { require( - msg.sender == address(strategyManager) || msg.sender == address(eigenPodManager), - "DelegationManager: onlyStrategyManagerOrEigenPodManager" + (msg.sender == address(strategyManager) || msg.sender == address(eigenPodManager)), + OnlyStrategyManagerOrEigenPodManager() ); _; } @@ -64,8 +71,20 @@ contract DelegationManager is constructor( IStrategyManager _strategyManager, ISlasher _slasher, - IEigenPodManager _eigenPodManager - ) DelegationManagerStorage(_strategyManager, _slasher, _eigenPodManager) { + IEigenPodManager _eigenPodManager, + IAVSDirectory _avsDirectory, + IAllocationManager _allocationManager, + uint32 _MIN_WITHDRAWAL_DELAY + ) + DelegationManagerStorage( + _strategyManager, + _slasher, + _eigenPodManager, + _avsDirectory, + _allocationManager, + _MIN_WITHDRAWAL_DELAY + ) + { _disableInitializers(); ORIGINAL_CHAIN_ID = block.chainid; } @@ -77,16 +96,11 @@ contract DelegationManager is function initialize( address initialOwner, IPauserRegistry _pauserRegistry, - uint256 initialPausedStatus, - uint256 _minWithdrawalDelayBlocks, - IStrategy[] calldata _strategies, - uint256[] calldata _withdrawalDelayBlocks + uint256 initialPausedStatus ) external initializer { _initializePauser(_pauserRegistry, initialPausedStatus); _DOMAIN_SEPARATOR = _calculateDomainSeparator(); _transferOwnership(initialOwner); - _setMinWithdrawalDelayBlocks(_minWithdrawalDelayBlocks); - _setStrategyWithdrawalDelayBlocks(_strategies, _withdrawalDelayBlocks); } /** @@ -98,6 +112,7 @@ contract DelegationManager is /** * @notice Registers the caller as an operator in EigenLayer. * @param registeringOperatorDetails is the `OperatorDetails` for the 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". @@ -106,9 +121,11 @@ contract DelegationManager is */ function registerAsOperator( OperatorDetails calldata registeringOperatorDetails, + uint32 allocationDelay, string calldata metadataURI ) external { - require(!isDelegated(msg.sender), "DelegationManager.registerAsOperator: caller is already actively delegated"); + require(!isDelegated(msg.sender), ActivelyDelegated()); + allocationManager.setAllocationDelay(msg.sender, allocationDelay); _setOperatorDetails(msg.sender, registeringOperatorDetails); SignatureWithExpiry memory emptySignatureAndExpiry; // delegate from the operator to themselves @@ -124,8 +141,10 @@ contract DelegationManager is * * @dev The caller must have previously registered as an operator in EigenLayer. */ - function modifyOperatorDetails(OperatorDetails calldata newOperatorDetails) external { - require(isOperator(msg.sender), "DelegationManager.modifyOperatorDetails: caller must be an operator"); + function modifyOperatorDetails( + OperatorDetails calldata newOperatorDetails + ) external { + require(isOperator(msg.sender), OperatorNotRegistered()); _setOperatorDetails(msg.sender, newOperatorDetails); } @@ -133,8 +152,10 @@ contract DelegationManager is * @notice Called by an operator to emit an `OperatorMetadataURIUpdated` event indicating the information has updated. * @param metadataURI The URI for metadata associated with an operator */ - function updateOperatorMetadataURI(string calldata metadataURI) external { - require(isOperator(msg.sender), "DelegationManager.updateOperatorMetadataURI: caller must be an operator"); + function updateOperatorMetadataURI( + string calldata metadataURI + ) external { + require(isOperator(msg.sender), OperatorNotRegistered()); emit OperatorMetadataURIUpdated(msg.sender, metadataURI); } @@ -156,8 +177,8 @@ contract DelegationManager is SignatureWithExpiry memory approverSignatureAndExpiry, bytes32 approverSalt ) external { - require(!isDelegated(msg.sender), "DelegationManager.delegateTo: staker is already actively delegated"); - require(isOperator(operator), "DelegationManager.delegateTo: operator is not registered in EigenLayer"); + require(!isDelegated(msg.sender), ActivelyDelegated()); + require(isOperator(operator), OperatorNotRegistered()); // go through the internal delegation flow, checking the `approverSignatureAndExpiry` if applicable _delegate(msg.sender, operator, approverSignatureAndExpiry, approverSalt); } @@ -187,14 +208,9 @@ contract DelegationManager is bytes32 approverSalt ) external { // check the signature expiry - require( - stakerSignatureAndExpiry.expiry >= block.timestamp, - "DelegationManager.delegateToBySignature: staker signature expired" - ); - require(!isDelegated(staker), "DelegationManager.delegateToBySignature: staker is already actively delegated"); - require( - isOperator(operator), "DelegationManager.delegateToBySignature: operator is not registered in EigenLayer" - ); + require(stakerSignatureAndExpiry.expiry >= block.timestamp, SignatureExpired()); + require(!isDelegated(staker), ActivelyDelegated()); + require(isOperator(operator), OperatorNotRegistered()); // calculate the digest hash, then increment `staker`'s nonce uint256 currentStakerNonce = stakerNonce[staker]; @@ -216,22 +232,20 @@ contract DelegationManager is * a staker from their operator. Undelegation immediately removes ALL active shares/strategies from * both the staker and operator, and places the shares and strategies in the withdrawal queue */ - function undelegate(address staker) - external - onlyWhenNotPaused(PAUSED_ENTER_WITHDRAWAL_QUEUE) - returns (bytes32[] memory withdrawalRoots) - { - require(isDelegated(staker), "DelegationManager.undelegate: staker must be delegated to undelegate"); - require(!isOperator(staker), "DelegationManager.undelegate: operators cannot be undelegated"); - require(staker != address(0), "DelegationManager.undelegate: cannot undelegate zero address"); + function undelegate( + address staker + ) external onlyWhenNotPaused(PAUSED_ENTER_WITHDRAWAL_QUEUE) returns (bytes32[] memory withdrawalRoots) { + require(isDelegated(staker), NotActivelyDelegated()); + require(!isOperator(staker), OperatorsCannotUndelegate()); + require(staker != address(0), InputAddressZero()); address operator = delegatedTo[staker]; require( msg.sender == staker || msg.sender == operator || msg.sender == _operatorDetails[operator].delegationApprover, - "DelegationManager.undelegate: caller cannot undelegate staker" + CallerCannotUndelegate() ); - // Gather strategies and shares to remove from staker/operator during undelegation + // Gather strategies and shares from the staker. Calculate delegatedShares to remove from operator during undelegation // Undelegation removes ALL currently-active strategies and shares (IStrategy[] memory strategies, uint256[] memory shares) = getDelegatableShares(staker); @@ -249,19 +263,27 @@ contract DelegationManager is withdrawalRoots = new bytes32[](0); } else { withdrawalRoots = new bytes32[](strategies.length); + uint64[] memory totalMagnitudes = allocationManager.getTotalMagnitudes(operator, strategies); + for (uint256 i = 0; i < strategies.length; i++) { IStrategy[] memory singleStrategy = new IStrategy[](1); uint256[] memory singleShare = new uint256[](1); + uint64[] memory singleTotalMagnitude = new uint64[](1); singleStrategy[0] = strategies[i]; singleShare[0] = shares[i]; + singleTotalMagnitude[0] = totalMagnitudes[i]; withdrawalRoots[i] = _removeSharesAndQueueWithdrawal({ staker: staker, operator: operator, - withdrawer: staker, strategies: singleStrategy, - shares: singleShare + sharesToWithdraw: singleShare, + totalMagnitudes: singleTotalMagnitude }); + + // all shares and queued withdrawn and no delegated operator + // reset staker's depositScalingFactor to default + depositScalingFactors[staker][strategies[i]] = WAD; } } @@ -275,23 +297,21 @@ contract DelegationManager is * * All withdrawn shares/strategies are placed in a queue and can be fully withdrawn after a delay. */ - function queueWithdrawals(QueuedWithdrawalParams[] calldata queuedWithdrawalParams) - external - onlyWhenNotPaused(PAUSED_ENTER_WITHDRAWAL_QUEUE) - returns (bytes32[] memory) - { + function queueWithdrawals( + QueuedWithdrawalParams[] calldata queuedWithdrawalParams + ) external onlyWhenNotPaused(PAUSED_ENTER_WITHDRAWAL_QUEUE) returns (bytes32[] memory) { bytes32[] memory withdrawalRoots = new bytes32[](queuedWithdrawalParams.length); address operator = delegatedTo[msg.sender]; for (uint256 i = 0; i < queuedWithdrawalParams.length; i++) { require( queuedWithdrawalParams[i].strategies.length == queuedWithdrawalParams[i].shares.length, - "DelegationManager.queueWithdrawal: input length mismatch" - ); - require( - queuedWithdrawalParams[i].withdrawer == msg.sender, - "DelegationManager.queueWithdrawal: withdrawer must be staker" + InputArrayLengthMismatch() ); + require(queuedWithdrawalParams[i].withdrawer == msg.sender, WithdrawerNotStaker()); + + uint64[] memory totalMagnitudes = + allocationManager.getTotalMagnitudes(operator, queuedWithdrawalParams[i].strategies); // 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 @@ -299,9 +319,9 @@ contract DelegationManager is withdrawalRoots[i] = _removeSharesAndQueueWithdrawal({ staker: msg.sender, operator: operator, - withdrawer: queuedWithdrawalParams[i].withdrawer, strategies: queuedWithdrawalParams[i].strategies, - shares: queuedWithdrawalParams[i].shares + sharesToWithdraw: queuedWithdrawalParams[i].shares, + totalMagnitudes: totalMagnitudes }); } return withdrawalRoots; @@ -311,12 +331,9 @@ contract DelegationManager is * @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. @@ -324,10 +341,9 @@ contract DelegationManager is function completeQueuedWithdrawal( Withdrawal calldata withdrawal, IERC20[] calldata tokens, - uint256 middlewareTimesIndex, bool receiveAsTokens ) external onlyWhenNotPaused(PAUSED_EXIT_WITHDRAWAL_QUEUE) nonReentrant { - _completeQueuedWithdrawal(withdrawal, tokens, middlewareTimesIndex, receiveAsTokens); + _completeQueuedWithdrawal(withdrawal, tokens, receiveAsTokens); } /** @@ -335,93 +351,86 @@ contract DelegationManager is * 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( Withdrawal[] calldata withdrawals, IERC20[][] calldata tokens, - uint256[] calldata middlewareTimesIndexes, bool[] calldata receiveAsTokens ) external onlyWhenNotPaused(PAUSED_EXIT_WITHDRAWAL_QUEUE) nonReentrant { for (uint256 i = 0; i < withdrawals.length; ++i) { - _completeQueuedWithdrawal(withdrawals[i], tokens[i], middlewareTimesIndexes[i], receiveAsTokens[i]); + _completeQueuedWithdrawal(withdrawals[i], tokens[i], receiveAsTokens[i]); } } /** - * @notice Increases a staker's delegated share balance in a strategy. + * @notice Increases a staker's delegated share balance in a strategy. Note that before adding to operator shares, + * the delegated delegatedShares. The staker's depositScalingFactor is updated here. * @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. + * @param existingPrincipalShares The number of deposit shares the staker already has in the strategy. This is the shares amount stored in the + * StrategyManager/EigenPodManager for the staker's shares. + * @param addedShares The number of shares to added to the staker's shares in the strategy * - * @dev *If the staker is actively delegated*, then increases the `staker`'s delegated shares in `strategy` by `shares`. Otherwise does nothing. + * @dev *If the staker is actively delegated*, then increases the `staker`'s delegated delegatedShares in `strategy`. + * Otherwise does nothing. * @dev Callable only by the StrategyManager or EigenPodManager. */ function increaseDelegatedShares( address staker, IStrategy strategy, - uint256 shares + uint256 existingPrincipalShares, + uint256 addedShares ) external onlyStrategyManagerOrEigenPodManager { // if the staker is delegated to an operator if (isDelegated(staker)) { address operator = delegatedTo[staker]; + uint64 totalMagnitude = allocationManager.getTotalMagnitude(operator, strategy); - // add strategy shares to delegate's shares - _increaseOperatorShares({operator: operator, staker: staker, strategy: strategy, shares: shares}); + // add deposit shares to operator's stake shares and update the staker's depositScalingFactor + _increaseDelegation({ + operator: operator, + staker: staker, + strategy: strategy, + existingPrincipalShares: existingPrincipalShares, + addedShares: addedShares, + totalMagnitude: totalMagnitude + }); } } + // IGNORE THIS FUNCTION /** - * @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. + * @notice Decreases a staker's delegated delegatedShares for a strategy. + * @param staker The address to increase the delegated scaled shares for their operator. + * @param strategy The strategy in which to decrease the delegated scaled shares. + * @param removedShares The number of shares to decremented for the strategy in the + * StrategyManager/EigenPodManager * - * @dev *If the staker is actively delegated*, then decreases the `staker`'s delegated shares in `strategy` by `shares`. Otherwise does nothing. + * @dev *If the staker is actively delegated*, then decreases the `staker`'s delegated delegatedShares in `strategy` by `scaledShares`. Otherwise does nothing. * @dev Callable only by the StrategyManager or EigenPodManager. */ function decreaseDelegatedShares( address staker, IStrategy strategy, - uint256 shares + uint256 removedShares ) external onlyStrategyManagerOrEigenPodManager { // if the staker is delegated to an operator - if (isDelegated(staker)) { - address operator = delegatedTo[staker]; + // if (isDelegated(staker)) { + // address operator = delegatedTo[staker]; - // forgefmt: disable-next-item - // subtract strategy shares from delegate's shares - _decreaseOperatorShares({ - operator: operator, - staker: staker, - strategy: strategy, - shares: shares - }); - } - } + // uint64 totalMagnitude = allocationManager.getTotalMagnitude(operator, strategy); - /** - * @notice Owner-only function for modifying the value of the `minWithdrawalDelayBlocks` variable. - * @param newMinWithdrawalDelayBlocks new value of `minWithdrawalDelayBlocks`. - */ - function setMinWithdrawalDelayBlocks(uint256 newMinWithdrawalDelayBlocks) external onlyOwner { - _setMinWithdrawalDelayBlocks(newMinWithdrawalDelayBlocks); - } - - /** - * @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, - uint256[] calldata withdrawalDelayBlocks - ) external onlyOwner { - _setStrategyWithdrawalDelayBlocks(strategies, withdrawalDelayBlocks); + // // subtract strategy shares from delegated scaled shares + // _decreaseOperatorScaledShares({ + // operator: operator, + // staker: staker, + // strategy: strategy, + // shares: removedShares, + // totalMagnitude: totalMagnitude + // }); + // } } /** @@ -436,14 +445,6 @@ contract DelegationManager is * @param newOperatorDetails The new parameters for the operator */ function _setOperatorDetails(address operator, OperatorDetails calldata newOperatorDetails) internal { - require( - newOperatorDetails.stakerOptOutWindowBlocks <= MAX_STAKER_OPT_OUT_WINDOW_BLOCKS, - "DelegationManager._setOperatorDetails: stakerOptOutWindowBlocks cannot be > MAX_STAKER_OPT_OUT_WINDOW_BLOCKS" - ); - require( - newOperatorDetails.stakerOptOutWindowBlocks >= _operatorDetails[operator].stakerOptOutWindowBlocks, - "DelegationManager._setOperatorDetails: stakerOptOutWindowBlocks cannot be decreased" - ); _operatorDetails[operator] = newOperatorDetails; emit OperatorDetailsModified(msg.sender, newOperatorDetails); } @@ -476,15 +477,9 @@ contract DelegationManager is */ if (_delegationApprover != address(0) && msg.sender != _delegationApprover && msg.sender != operator) { // check the signature expiry - require( - approverSignatureAndExpiry.expiry >= block.timestamp, - "DelegationManager._delegate: approver signature expired" - ); + require(approverSignatureAndExpiry.expiry >= block.timestamp, SignatureExpired()); // check that the salt hasn't been used previously, then mark the salt as spent - require( - !delegationApproverSaltIsSpent[_delegationApprover][approverSalt], - "DelegationManager._delegate: approverSalt already spent" - ); + require(!delegationApproverSaltIsSpent[_delegationApprover][approverSalt], SaltSpent()); delegationApproverSaltIsSpent[_delegationApprover][approverSalt] = true; // forgefmt: disable-next-item @@ -510,199 +505,178 @@ contract DelegationManager is delegatedTo[staker] = operator; emit StakerDelegated(staker, operator); + // read staker's delegatable shares and strategies to add to operator's delegatedShares + // and also update the staker depositScalingFactor for each strategy (IStrategy[] memory strategies, uint256[] memory shares) = getDelegatableShares(staker); + uint64[] memory totalMagnitudes = allocationManager.getTotalMagnitudes(operator, strategies); - for (uint256 i = 0; i < strategies.length;) { + for (uint256 i = 0; i < strategies.length; ++i) { // forgefmt: disable-next-item - _increaseOperatorShares({ + _increaseDelegation({ operator: operator, staker: staker, - strategy: strategies[i], - shares: shares[i] + strategy: strategies[i], + existingPrincipalShares: 0, + addedShares: shares[i], + totalMagnitude: totalMagnitudes[i] }); - - unchecked { - ++i; - } } } /** - * @dev commented-out param (middlewareTimesIndex) is the index in the operator that the staker who triggered the withdrawal was delegated to's middleware times array - * This param is intended to be passed on to the Slasher contract, but is unused in the M2 release of these contracts, and is thus commented-out. + * @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 withdrawl's + * delegatedShares by the operator's total magnitude for each strategy + * 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( Withdrawal calldata withdrawal, IERC20[] calldata tokens, - uint256, /*middlewareTimesIndex*/ bool receiveAsTokens ) internal { + require(tokens.length == withdrawal.strategies.length, InputArrayLengthMismatch()); + require(msg.sender == withdrawal.withdrawer, WithdrawerNotCaller()); bytes32 withdrawalRoot = calculateWithdrawalRoot(withdrawal); + require(pendingWithdrawals[withdrawalRoot], WithdrawalNotQueued()); + + // TODO: is there a cleaner way to do this? + uint32 completableTimestamp = _checkCompletability(withdrawal.startTimestamp); + // read delegated operator's totalMagnitudes at time of withdrawal to convert the delegatedShares to shared + // factoring in slashing that occured during withdrawal delay + uint64[] memory totalMagnitudes = allocationManager.getTotalMagnitudesAtTimestamp({ + operator: withdrawal.delegatedTo, + strategies: withdrawal.strategies, + timestamp: completableTimestamp + }); - require( - pendingWithdrawals[withdrawalRoot], "DelegationManager._completeQueuedWithdrawal: action is not in queue" - ); - - require( - withdrawal.startBlock + minWithdrawalDelayBlocks <= block.number, - "DelegationManager._completeQueuedWithdrawal: minWithdrawalDelayBlocks period has not yet passed" - ); - - require( - msg.sender == withdrawal.withdrawer, - "DelegationManager._completeQueuedWithdrawal: only withdrawer can complete action" - ); - - if (receiveAsTokens) { - require( - tokens.length == withdrawal.strategies.length, - "DelegationManager._completeQueuedWithdrawal: input length mismatch" - ); - } - - // Remove `withdrawalRoot` from pending roots - delete pendingWithdrawals[withdrawalRoot]; - - if (receiveAsTokens) { - // Finalize action by converting shares to tokens for each strategy, or - // by re-awarding shares in each strategy. - for (uint256 i = 0; i < withdrawal.strategies.length;) { - require( - withdrawal.startBlock + strategyWithdrawalDelayBlocks[withdrawal.strategies[i]] <= block.number, - "DelegationManager._completeQueuedWithdrawal: withdrawalDelayBlocks period has not yet passed for this strategy" - ); - - _withdrawSharesAsTokens({ - staker: withdrawal.staker, - withdrawer: msg.sender, + for (uint256 i = 0; i < withdrawal.strategies.length; i++) { + IShareManager shareManager = _getShareManager(withdrawal.strategies[i]); + uint256 sharesToWithdraw = Shares.unwrap(withdrawal.delegatedShares[i].toShares(totalMagnitudes[i])); + if (receiveAsTokens) { + // Withdraws `shares` in `strategy` to `withdrawer`. If the shares are virtual beaconChainETH shares, + // then a call is ultimately forwarded to the `staker`s EigenPod; otherwise a call is ultimately forwarded + // to the `strategy` with info on the `token`. + shareManager.withdrawSharesAsTokens({ + recipient: withdrawal.staker, strategy: withdrawal.strategies[i], - shares: withdrawal.shares[i], + shares: sharesToWithdraw, token: tokens[i] }); - unchecked { - ++i; - } - } - } else { - // Award shares back in StrategyManager/EigenPodManager. - // If withdrawer is delegated, increase the shares delegated to the operator. - address currentOperator = delegatedTo[msg.sender]; - for (uint256 i = 0; i < withdrawal.strategies.length;) { - require( - withdrawal.startBlock + strategyWithdrawalDelayBlocks[withdrawal.strategies[i]] <= block.number, - "DelegationManager._completeQueuedWithdrawal: withdrawalDelayBlocks period has not yet passed for this strategy" - ); - - /** - * When awarding podOwnerShares in EigenPodManager, we need to be sure to only give them back to the original podOwner. - * Other strategy shares can + will be awarded to the withdrawer. - */ - if (withdrawal.strategies[i] == beaconChainETHStrategy) { - address staker = withdrawal.staker; - /** - * Update shares amount depending upon the returned value. - * The return value will be lower than the input value in the case where the staker has an existing share deficit - */ - uint256 increaseInDelegateableShares = - eigenPodManager.addShares({podOwner: staker, shares: withdrawal.shares[i]}); - address podOwnerOperator = delegatedTo[staker]; - // Similar to `isDelegated` logic - if (podOwnerOperator != address(0)) { - _increaseOperatorShares({ - operator: podOwnerOperator, - // the 'staker' here is the address receiving new shares - staker: staker, - strategy: withdrawal.strategies[i], - shares: increaseInDelegateableShares - }); - } - } else { - strategyManager.addShares(msg.sender, tokens[i], withdrawal.strategies[i], withdrawal.shares[i]); - // Similar to `isDelegated` logic - if (currentOperator != address(0)) { - _increaseOperatorShares({ - operator: currentOperator, - // the 'staker' here is the address receiving new shares - staker: msg.sender, - strategy: withdrawal.strategies[i], - shares: withdrawal.shares[i] - }); - } - } - unchecked { - ++i; - } + } else { + // Award shares back in StrategyManager/EigenPodManager. + shareManager.addShares(msg.sender, tokens[i], withdrawal.strategies[i], sharesToWithdraw); } } + // Remove `withdrawalRoot` from pending roots + delete pendingWithdrawals[withdrawalRoot]; emit WithdrawalCompleted(withdrawalRoot); } - // @notice Increases `operator`s delegated shares in `strategy` by `shares` and emits an `OperatorSharesIncreased` event - function _increaseOperatorShares(address operator, address staker, IStrategy strategy, uint256 shares) internal { - operatorShares[operator][strategy] += shares; - emit OperatorSharesIncreased(operator, staker, strategy, shares); + /** + * @notice Increases `operator`s delegated delegatedShares in `strategy` based on staker's added shares and operator's totalMagnitude + * and increases 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 existingPrincipalShares The number of deposit shares the staker already has in the strategy. + * @param addedShares The shares added to the staker in the StrategyManager/EigenPodManager + * @param totalMagnitude The current total magnitude of the operator for the strategy + */ + function _increaseDelegation( + address operator, + address staker, + IStrategy strategy, + uint256 existingPrincipalShares, + uint256 addedShares, + uint64 totalMagnitude + ) internal { + _updateDepositScalingFactor({ + staker: staker, + strategy: strategy, + existingPrincipalShares: existingPrincipalShares, + addedShares: addedShares, + totalMagnitude: totalMagnitude + }); + + // based on total magnitude, update operators delegatedShares + uint256 delegatedShares = DelegatedShares.unwrap(Shares.wrap(addedShares).toDelegatedShares(totalMagnitude)); + operatorDelegatedShares[operator][strategy] += delegatedShares; + + // TODO: What to do about event wrt scaling? + emit OperatorSharesIncreased(operator, staker, strategy, delegatedShares); } - // @notice Decreases `operator`s delegated shares in `strategy` by `shares` and emits an `OperatorSharesDecreased` event - function _decreaseOperatorShares(address operator, address staker, IStrategy strategy, uint256 shares) internal { - // This will revert on underflow, so no check needed - operatorShares[operator][strategy] -= shares; - emit OperatorSharesDecreased(operator, staker, strategy, shares); + /** + * @notice Decreases `operator`s delegated delegatedShares in `strategy` based on staker's removed shares and operator's totalMagnitude + * @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 delegatedShares The delegatedShares to remove from the operator's delegated shares + */ + function _decreaseDelegation( + address operator, + address staker, + IStrategy strategy, + uint256 delegatedShares + ) internal { + // based on total magnitude, decrement operator's delegatedShares + operatorDelegatedShares[operator][strategy] -= delegatedShares; + // TODO: What to do about event wrt scaling? + emit OperatorSharesDecreased(operator, staker, strategy, delegatedShares); } /** - * @notice Removes `shares` in `strategies` from `staker` who is currently delegated to `operator` and queues a withdrawal to the `withdrawer`. + * @notice Removes `sharesToWithdraw` in `strategies` from `staker` who is currently delegated to `operator` and queues a withdrawal to the `withdrawer`. * @dev If the `operator` is indeed an operator, then the operator's delegated shares in the `strategies` are also decreased appropriately. - * @dev If `withdrawer` is not the same address as `staker`, then thirdPartyTransfersForbidden[strategy] must be set to false in the StrategyManager. + * @dev If `withdrawer` is not the same address as `staker` */ function _removeSharesAndQueueWithdrawal( address staker, address operator, - address withdrawer, IStrategy[] memory strategies, - uint256[] memory shares + uint256[] memory sharesToWithdraw, + uint64[] memory totalMagnitudes ) internal returns (bytes32) { - require( - staker != address(0), "DelegationManager._removeSharesAndQueueWithdrawal: staker cannot be zero address" - ); - require(strategies.length != 0, "DelegationManager._removeSharesAndQueueWithdrawal: strategies cannot be empty"); + require(staker != address(0), InputAddressZero()); + require(strategies.length != 0, InputArrayLengthZero()); + + DelegatedShares[] memory delegatedSharesToWithdraw = new DelegatedShares[](strategies.length); // Remove shares from staker and operator // Each of these operations fail if we attempt to remove more shares than exist - for (uint256 i = 0; i < strategies.length;) { + for (uint256 i = 0; i < strategies.length; ++i) { + IShareManager shareManager = _getShareManager(strategies[i]); + + // delegatedShares for staker to place into queueWithdrawal + delegatedSharesToWithdraw[i] = Shares.wrap(sharesToWithdraw[i]).toDelegatedShares(totalMagnitudes[i]); + uint256 principalSharesToWithdraw = PrincipalShares.unwrap( + delegatedSharesToWithdraw[i].toPrincipalShares(depositScalingFactors[staker][strategies[i]]) + ); + + // TODO: maybe have a getter to get shares for all strategies, like getDelegatableShares + // check sharesToWithdraw is valid + // but for inputted strategies + uint256 principalSharesWithdrawable = shareManager.stakerStrategyShares(staker, strategies[i]); + require(principalSharesToWithdraw <= principalSharesWithdrawable, WithdrawalExeedsMax()); + // Similar to `isDelegated` logic if (operator != address(0)) { // forgefmt: disable-next-item - _decreaseOperatorShares({ + _decreaseDelegation({ operator: operator, staker: staker, strategy: strategies[i], - shares: shares[i] + delegatedShares: DelegatedShares.unwrap(delegatedSharesToWithdraw[i]) }); } // Remove active shares from EigenPodManager/StrategyManager - if (strategies[i] == beaconChainETHStrategy) { - /** - * This call will revert if it would reduce the Staker's virtual beacon chain ETH shares below zero. - * This behavior prevents a Staker from queuing a withdrawal which improperly removes excessive - * shares from the operator to whom the staker is delegated. - * It will also revert if the share amount being withdrawn is not a whole Gwei amount. - */ - eigenPodManager.removeShares(staker, shares[i]); - } else { - require( - staker == withdrawer || !strategyManager.thirdPartyTransfersForbidden(strategies[i]), - "DelegationManager._removeSharesAndQueueWithdrawal: withdrawer must be same address as staker if thirdPartyTransfersForbidden are set" - ); - // this call will revert if `shares[i]` exceeds the Staker's current shares in `strategies[i]` - strategyManager.removeShares(staker, strategies[i], shares[i]); - } - - unchecked { - ++i; - } + // EigenPodManager: this call will revert if it would reduce the Staker's virtual beacon chain ETH shares below zero + // StrategyManager: this call will revert if `principalSharesToDecrement` exceeds the Staker's current deposit shares in `strategies[i]` + shareManager.removeShares(staker, strategies[i], principalSharesToWithdraw); } // Create queue entry and increment withdrawal nonce @@ -712,11 +686,11 @@ contract DelegationManager is Withdrawal memory withdrawal = Withdrawal({ staker: staker, delegatedTo: operator, - withdrawer: withdrawer, + withdrawer: staker, nonce: nonce, - startBlock: uint32(block.number), + startTimestamp: uint32(block.timestamp), strategies: strategies, - shares: shares + delegatedShares: delegatedSharesToWithdraw }); bytes32 withdrawalRoot = calculateWithdrawalRoot(withdrawal); @@ -728,61 +702,84 @@ contract DelegationManager is return withdrawalRoot; } - /** - * @notice 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`. - */ - function _withdrawSharesAsTokens( - address staker, - address withdrawer, - IStrategy strategy, - uint256 shares, - IERC20 token - ) internal { - if (strategy == beaconChainETHStrategy) { - eigenPodManager.withdrawSharesAsTokens({podOwner: staker, destination: withdrawer, shares: shares}); + /// @dev check whether the withdrawal delay has elapsed (handles both legacy and post-slashing-release withdrawals) and returns the completable timestamp + function _checkCompletability( + uint32 startTimestamp + ) internal view returns (uint32 completableTimestamp) { + if (startTimestamp < LEGACY_WITHDRAWALS_TIMESTAMP) { + // this is a legacy M2 withdrawal using blocknumbers. + // It would take up to 600+ years for the blocknumber to reach the LEGACY_WITHDRAWALS_TIMESTAMP, so this is a safe check. + require(startTimestamp + LEGACY_MIN_WITHDRAWAL_DELAY_BLOCKS <= block.number, WithdrawalDelayNotElapsed()); + // sourcing the magnitudes from time=0, will always give us WAD, which doesn't factor in slashing + completableTimestamp = 0; } else { - strategyManager.withdrawSharesAsTokens(withdrawer, strategy, shares, token); + // this is a post Slashing release withdrawal using timestamps + require(startTimestamp + MIN_WITHDRAWAL_DELAY <= block.timestamp, WithdrawalDelayNotElapsed()); + // source magnitudes from the time of completability + completableTimestamp = startTimestamp + MIN_WITHDRAWAL_DELAY; } } - function _setMinWithdrawalDelayBlocks(uint256 _minWithdrawalDelayBlocks) internal { - require( - _minWithdrawalDelayBlocks <= MAX_WITHDRAWAL_DELAY_BLOCKS, - "DelegationManager._setMinWithdrawalDelayBlocks: _minWithdrawalDelayBlocks cannot be > MAX_WITHDRAWAL_DELAY_BLOCKS" - ); - emit MinWithdrawalDelayBlocksSet(minWithdrawalDelayBlocks, _minWithdrawalDelayBlocks); - minWithdrawalDelayBlocks = _minWithdrawalDelayBlocks; - } - /** - * @notice Sets the withdrawal delay blocks for each strategy in `_strategies` to `_withdrawalDelayBlocks`. - * gets called when initializing contract or by calling `setStrategyWithdrawalDelayBlocks` + * + * SHARES CONVERSION FUNCTIONS + * */ - function _setStrategyWithdrawalDelayBlocks( - IStrategy[] calldata _strategies, - uint256[] calldata _withdrawalDelayBlocks - ) internal { - require( - _strategies.length == _withdrawalDelayBlocks.length, - "DelegationManager._setStrategyWithdrawalDelayBlocks: input length mismatch" - ); - uint256 numStrats = _strategies.length; - for (uint256 i = 0; i < numStrats; ++i) { - IStrategy strategy = _strategies[i]; - uint256 prevStrategyWithdrawalDelayBlocks = strategyWithdrawalDelayBlocks[strategy]; - uint256 newStrategyWithdrawalDelayBlocks = _withdrawalDelayBlocks[i]; - require( - newStrategyWithdrawalDelayBlocks <= MAX_WITHDRAWAL_DELAY_BLOCKS, - "DelegationManager._setStrategyWithdrawalDelayBlocks: _withdrawalDelayBlocks cannot be > MAX_WITHDRAWAL_DELAY_BLOCKS" - ); - // set the new withdrawal delay blocks - strategyWithdrawalDelayBlocks[strategy] = newStrategyWithdrawalDelayBlocks; - emit StrategyWithdrawalDelayBlocksSet( - strategy, prevStrategyWithdrawalDelayBlocks, newStrategyWithdrawalDelayBlocks + /** + * @notice helper to calculate the new depositScalingFactor after adding shares. This is only used + * when a staker is depositing through the StrategyManager or EigenPodManager. A staker's depositScalingFactor + * is only updated when they have new deposits and their shares are being increased. + */ + function _updateDepositScalingFactor( + address staker, + IStrategy strategy, + uint64 totalMagnitude, + uint256 existingPrincipalShares, + uint256 addedShares + ) internal returns (uint256) { + uint256 newDepositScalingFactor; + + if (existingPrincipalShares == 0) { + // existing shares are 0, meaning no existing delegated shares. In this case, the new depositScalingFactor + // is re-initialized to + newDepositScalingFactor = WAD / totalMagnitude; + } else { + // TODO: OVERFLOWS: switch to muldiv everywhere + // since + // + // newShares + // = existingShares + addedShares + // = existingPrincipalShares.toDelegatedShares(stakerScalingFactors[staker][strategy).toShares(totalMagnitude) + addedShares + // + // and it also is + // + // newShares + // = newPrincipalShares.toDelegatedShares(stakerScalingFactors[staker][strategy).toShares(totalMagnitude) + // = newPrincipalShares * newDepositScalingFactor / WAD * totalMagnitude / WAD + // = (existingPrincipalShares + addedShares) * newDepositScalingFactor / WAD * totalMagnitude / WAD + // + // we can solve for + // + uint256 existingShares = Shares.unwrap( + PrincipalShares.wrap(existingPrincipalShares).toDelegatedShares(depositScalingFactors[staker][strategy]).toShares( + totalMagnitude + ) ); + newDepositScalingFactor = (existingShares + addedShares) * WAD + / (existingPrincipalShares + addedShares) * WAD / totalMagnitude; } + + // update the staker's depositScalingFactor + depositScalingFactors[staker][strategy] = newDepositScalingFactor; + } + + function _getShareManager( + IStrategy strategy + ) internal view returns (IShareManager) { + return strategy == beaconChainETHStrategy + ? IShareManager(address(eigenPodManager)) + : IShareManager(address(strategyManager)); } /** @@ -809,117 +806,130 @@ contract DelegationManager is /** * @notice Returns 'true' if `staker` *is* actively delegated, and 'false' otherwise. */ - function isDelegated(address staker) public view returns (bool) { + function isDelegated( + address staker + ) public view returns (bool) { return (delegatedTo[staker] != address(0)); } /** * @notice Returns true is an operator has previously registered for delegation. */ - function isOperator(address operator) public view returns (bool) { + function isOperator( + address operator + ) public view returns (bool) { return operator != address(0) && delegatedTo[operator] == operator; } /** * @notice Returns the OperatorDetails struct associated with an `operator`. */ - function operatorDetails(address operator) external view returns (OperatorDetails memory) { + function operatorDetails( + address operator + ) external view returns (OperatorDetails memory) { return _operatorDetails[operator]; } /** * @notice Returns the delegationApprover account for an operator */ - function delegationApprover(address operator) external view returns (address) { + function delegationApprover( + address operator + ) external view returns (address) { return _operatorDetails[operator].delegationApprover; } /** * @notice Returns the stakerOptOutWindowBlocks for an operator */ - function stakerOptOutWindowBlocks(address operator) external view returns (uint256) { + function stakerOptOutWindowBlocks( + address operator + ) external view returns (uint256) { return _operatorDetails[operator].stakerOptOutWindowBlocks; } - /// @notice Given array of strategies, returns array of shares for the operator - function getOperatorShares( + /// @notice a legacy function that returns the total delegated shares for an operator and strategy + function operatorShares(address operator, IStrategy strategy) public view returns (uint256) { + uint64 totalMagnitude = allocationManager.getTotalMagnitude(operator, strategy); + return Shares.unwrap(DelegatedShares.wrap(operatorDelegatedShares[operator][strategy]).toShares(totalMagnitude)); + } + + /// @notice Given array of strategies, returns array of delegated shares for the operator + function getOperatorDelegatedShares( address operator, IStrategy[] memory strategies - ) public view returns (uint256[] memory) { - uint256[] memory shares = new uint256[](strategies.length); + ) external view returns (uint256[] memory) { + uint256[] memory delegatedShares = new uint256[](strategies.length); for (uint256 i = 0; i < strategies.length; ++i) { - shares[i] = operatorShares[operator][strategies[i]]; + delegatedShares[i] = operatorDelegatedShares[operator][strategies[i]]; } - return shares; + return delegatedShares; } /** - * @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. + * @notice Given a staker and a set of strategies, return the shares they can queue for withdrawal. + * 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 getDelegatableShares(address staker) public view returns (IStrategy[] memory, uint256[] memory) { - // Get currently active shares and strategies for `staker` - int256 podShares = eigenPodManager.podOwnerShares(staker); - (IStrategy[] memory strategyManagerStrats, uint256[] memory strategyManagerShares) = - strategyManager.getDeposits(staker); - - // Has no shares in EigenPodManager, but potentially some in StrategyManager - if (podShares <= 0) { - return (strategyManagerStrats, strategyManagerShares); - } - - IStrategy[] memory strategies; - uint256[] memory shares; - - if (strategyManagerStrats.length == 0) { - // Has shares in EigenPodManager, but not in StrategyManager - strategies = new IStrategy[](1); - shares = new uint256[](1); - strategies[0] = beaconChainETHStrategy; - shares[0] = uint256(podShares); - } else { - // Has shares in both - - // 1. Allocate return arrays - strategies = new IStrategy[](strategyManagerStrats.length + 1); - shares = new uint256[](strategies.length); - - // 2. Place StrategyManager strats/shares in return arrays - for (uint256 i = 0; i < strategyManagerStrats.length;) { - strategies[i] = strategyManagerStrats[i]; - shares[i] = strategyManagerShares[i]; + function getDelegatableShares( + address staker, + IStrategy[] memory strategies + ) public view returns (uint256[] memory shares) { + address operator = delegatedTo[staker]; + for (uint256 i = 0; i < strategies.length; ++i) { + IShareManager shareManager = _getShareManager(strategies[i]); + // TODO: batch call for strategyManager shares? + // 1. read strategy deposit shares + shares[i] = shareManager.stakerStrategyShares(staker, strategies[i]); - unchecked { - ++i; - } + // 2. if the staker is delegated, actual withdrawable shares can be different from what is stored + // in the StrategyManager/EigenPodManager because they could have been slashed + if (operator != address(0)) { + uint64 totalMagnitude = allocationManager.getTotalMagnitude(operator, strategies[i]); + shares[i] = Shares.unwrap( + PrincipalShares.wrap(shares[i]).toDelegatedShares(depositScalingFactors[staker][strategies[i]]) + .toShares(totalMagnitude) + ); } - - // 3. Place EigenPodManager strat/shares in return arrays - strategies[strategies.length - 1] = beaconChainETHStrategy; - shares[strategies.length - 1] = uint256(podShares); } - - return (strategies, shares); + return shares; } /** - * @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 + * @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 getWithdrawalDelay(IStrategy[] calldata strategies) public view returns (uint256) { - uint256 withdrawalDelay = minWithdrawalDelayBlocks; - for (uint256 i = 0; i < strategies.length; ++i) { - uint256 currWithdrawalDelay = strategyWithdrawalDelayBlocks[strategies[i]]; - if (currWithdrawalDelay > withdrawalDelay) { - withdrawalDelay = currWithdrawalDelay; - } + function getDelegatableShares( + address staker + ) public view returns (IStrategy[] memory, uint256[] memory) { + // Get a list of all the strategies to check + IStrategy[] memory strategies = strategyManager.getStakerStrategyList(staker); + // resize and add beaconChainETH to the end + IStrategy[] memory strategiesWithBeaconChainETH = new IStrategy[](strategies.length + 1); + for (uint256 i = 0; i < strategies.length; i++) { + strategiesWithBeaconChainETH[i] = strategies[i]; } - return withdrawalDelay; + strategiesWithBeaconChainETH[strategies.length] = beaconChainETHStrategy; + + // get the delegatable shares for each strategy + uint256[] memory shares = getDelegatableShares(staker, strategies); + // if the last shares are 0, remove them + // if (shares[strategies.length - 1] == 0) { + // // resize the arrays + // assembly { + // mstore(strategies, sub(mload(strategies), 1)) + // mstore(shares, sub(mload(shares), 1)) + // } + // } + + return (strategies, shares); } /// @notice Returns the keccak256 hash of `withdrawal`. - function calculateWithdrawalRoot(Withdrawal memory withdrawal) public pure returns (bytes32) { + function calculateWithdrawalRoot( + Withdrawal memory withdrawal + ) public pure returns (bytes32) { return keccak256(abi.encode(withdrawal)); } diff --git a/src/contracts/core/DelegationManagerStorage.sol b/src/contracts/core/DelegationManagerStorage.sol index 00fc5b4ac..5281df8f0 100644 --- a/src/contracts/core/DelegationManagerStorage.sol +++ b/src/contracts/core/DelegationManagerStorage.sol @@ -1,10 +1,12 @@ // SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.12; +pragma solidity ^0.8.27; import "../interfaces/IStrategyManager.sol"; import "../interfaces/IDelegationManager.sol"; import "../interfaces/ISlasher.sol"; +import "../interfaces/IAVSDirectory.sol"; import "../interfaces/IEigenPodManager.sol"; +import "../interfaces/IAllocationManager.sol"; /** * @title Storage variables for the `DelegationManager` contract. @@ -26,6 +28,9 @@ abstract contract DelegationManagerStorage is IDelegationManager { "DelegationApproval(address delegationApprover,address staker,address operator,bytes32 salt,uint256 expiry)" ); + /// @notice Minimum withdrawal delay in seconds until all queued withdrawals can be completed. + uint32 public immutable MIN_WITHDRAWAL_DELAY; + /** * @notice Original EIP-712 Domain separator for this contract. * @dev The domain separator may change in the event of a fork that modifies the ChainID. @@ -33,26 +38,33 @@ abstract contract DelegationManagerStorage is IDelegationManager { */ bytes32 internal _DOMAIN_SEPARATOR; + /// @notice The AVSDirectory contract for EigenLayer + IAVSDirectory public immutable avsDirectory; + + // TODO: Switch these to ShareManagers, but this breaks a lot of tests + /// @notice The StrategyManager contract for EigenLayer IStrategyManager public immutable strategyManager; - /// @notice The Slasher contract for EigenLayer - ISlasher public immutable slasher; - /// @notice The EigenPodManager contract for EigenLayer IEigenPodManager public immutable eigenPodManager; - // the number of 12-second blocks in 30 days (60 * 60 * 24 * 30 / 12 = 216,000) - uint256 public constant MAX_WITHDRAWAL_DELAY_BLOCKS = 216_000; + /// @notice The Slasher contract for EigenLayer + ISlasher public immutable slasher; + + /// @notice The AllocationManager contract for EigenLayer + IAllocationManager public immutable allocationManager; /** - * @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. + * @notice returns the total number of delegatedShares (i.e. shares divided by the `operator`'s + * totalMagnitude) in `strategy` that are delegated to `operator`. + * @notice Mapping: operator => strategy => total number of delegatedShares 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) + * (operator's delegatedShares in delegation manager) = sum (delegatedShares above zero of all stakers delegated to operator) + * = sum (delegateable delegatedShares of all stakers delegated to the operator) + * @dev FKA `operatorShares` */ - mapping(address => mapping(IStrategy => uint256)) public operatorShares; + mapping(address => mapping(IStrategy => uint256)) public operatorDelegatedShares; /** * @notice Mapping: operator => OperatorDetails struct @@ -83,7 +95,7 @@ abstract contract DelegationManagerStorage is IDelegationManager { * To withdraw from a strategy, max(minWithdrawalDelayBlocks, strategyWithdrawalDelayBlocks[strategy]) number of blocks must have passed. * See mapping strategyWithdrawalDelayBlocks below for per-strategy withdrawal delays. */ - uint256 public minWithdrawalDelayBlocks; + uint256 private __deprecated_minWithdrawalDelayBlocks; /// @notice Mapping: hash of withdrawal inputs, aka 'withdrawalRoot' => whether the withdrawal is pending mapping(bytes32 => bool) public pendingWithdrawals; @@ -100,12 +112,26 @@ abstract contract DelegationManagerStorage is IDelegationManager { * @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). */ - mapping(IStrategy => uint256) public strategyWithdrawalDelayBlocks; - - constructor(IStrategyManager _strategyManager, ISlasher _slasher, IEigenPodManager _eigenPodManager) { + mapping(IStrategy => uint256) private __deprecated_strategyWithdrawalDelayBlocks; + + /// @notice Mapping: staker => strategy => scaling factor used to calculate the staker's shares in the strategy. + /// This is updated upon each deposit based on the staker's currently delegated operator's totalMagnitude. + mapping(address => mapping(IStrategy => uint256)) public depositScalingFactors; + + constructor( + IStrategyManager _strategyManager, + ISlasher _slasher, + IEigenPodManager _eigenPodManager, + IAVSDirectory _avsDirectory, + IAllocationManager _allocationManager, + uint32 _MIN_WITHDRAWAL_DELAY + ) { strategyManager = _strategyManager; eigenPodManager = _eigenPodManager; slasher = _slasher; + avsDirectory = _avsDirectory; + allocationManager = _allocationManager; + MIN_WITHDRAWAL_DELAY = _MIN_WITHDRAWAL_DELAY; } /** @@ -113,5 +139,5 @@ abstract contract DelegationManagerStorage is IDelegationManager { * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ - uint256[39] private __gap; + uint256[38] private __gap; } diff --git a/src/contracts/core/RewardsCoordinator.sol b/src/contracts/core/RewardsCoordinator.sol index d23330e0a..3de80e295 100644 --- a/src/contracts/core/RewardsCoordinator.sol +++ b/src/contracts/core/RewardsCoordinator.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.12; +pragma solidity ^0.8.27; import "@openzeppelin-upgrades/contracts/proxy/utils/Initializable.sol"; import "@openzeppelin-upgrades/contracts/access/OwnableUpgradeable.sol"; @@ -34,6 +34,10 @@ contract RewardsCoordinator is uint256 internal immutable ORIGINAL_CHAIN_ID; /// @notice The maximum rewards token amount for a single rewards submission, constrained by off-chain calculation uint256 internal constant MAX_REWARDS_AMOUNT = 1e38 - 1; + /// @notice The activation delay until an updated operator's commission bips takes effect + uint32 internal constant OPERATOR_COMMISSION_ACTIVATION_DELAY = 7 days; + /// @notice The maximum commission bips that can be set for an operator + uint16 internal constant MAX_COMMISSION_BIPS = 10_000; /// @dev Index for flag that pauses calling createAVSRewardsSubmission uint8 internal constant PAUSED_AVS_REWARDS_SUBMISSION = 0; @@ -45,6 +49,8 @@ contract RewardsCoordinator is uint8 internal constant PAUSED_SUBMIT_DISABLE_ROOTS = 3; /// @dev Index for flag that pauses calling rewardAllStakersAndOperators uint8 internal constant PAUSED_REWARD_ALL_STAKERS_AND_OPERATORS = 4; + /// @dev Index for flag that pauses calling rewardOperatorSetForRange + uint8 internal constant PAUSED_REWARD_OPERATOR_SET = 5; /// @dev Salt for the earner leaf, meant to distinguish from tokenLeaf since they have the same sized data uint8 internal constant EARNER_LEAF_SALT = 0; @@ -55,15 +61,12 @@ contract RewardsCoordinator is IStrategy public constant beaconChainETHStrategy = IStrategy(0xbeaC0eeEeeeeEEeEeEEEEeeEEeEeeeEeeEEBEaC0); modifier onlyRewardsUpdater() { - require(msg.sender == rewardsUpdater, "RewardsCoordinator: caller is not the rewardsUpdater"); + require(msg.sender == rewardsUpdater, OnlyRewardsUpdater()); _; } modifier onlyRewardsForAllSubmitter() { - require( - isRewardsForAllSubmitter[msg.sender], - "RewardsCoordinator: caller is not a valid createRewardsForAllSubmission submitter" - ); + require(isRewardsForAllSubmitter[msg.sender], OnlyRewardsForAllSubmitter()); _; } @@ -71,20 +74,26 @@ contract RewardsCoordinator is constructor( IDelegationManager _delegationManager, IStrategyManager _strategyManager, + IAVSDirectory _avsDirectory, uint32 _CALCULATION_INTERVAL_SECONDS, uint32 _MAX_REWARDS_DURATION, uint32 _MAX_RETROACTIVE_LENGTH, uint32 _MAX_FUTURE_LENGTH, - uint32 __GENESIS_REWARDS_TIMESTAMP + uint32 _GENESIS_REWARDS_TIMESTAMP, + uint32 _OPERATOR_SET_GENESIS_REWARDS_TIMESTAMP, + uint32 _OPERATOR_SET_MAX_RETROACTIVE_LENGTH ) RewardsCoordinatorStorage( _delegationManager, _strategyManager, + _avsDirectory, _CALCULATION_INTERVAL_SECONDS, _MAX_REWARDS_DURATION, _MAX_RETROACTIVE_LENGTH, _MAX_FUTURE_LENGTH, - __GENESIS_REWARDS_TIMESTAMP + _GENESIS_REWARDS_TIMESTAMP, + _OPERATOR_SET_GENESIS_REWARDS_TIMESTAMP, + _OPERATOR_SET_MAX_RETROACTIVE_LENGTH ) { _disableInitializers(); @@ -118,7 +127,9 @@ contract RewardsCoordinator is */ /** - * @notice Creates a new rewards submission on behalf of an AVS, to be split amongst the + * @notice Legacy interface to be DEPRECATED in future releases. See rewardOperatorSetForRange + * for a more updated interface. + * 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 @@ -128,23 +139,33 @@ contract RewardsCoordinator is * @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(RewardsSubmission[] calldata rewardsSubmissions) - external - onlyWhenNotPaused(PAUSED_AVS_REWARDS_SUBMISSION) - nonReentrant - { - for (uint256 i = 0; i < rewardsSubmissions.length; i++) { + function createAVSRewardsSubmission( + RewardsSubmission[] calldata rewardsSubmissions + ) external onlyWhenNotPaused(PAUSED_AVS_REWARDS_SUBMISSION) nonReentrant { + for (uint256 i = 0; i < rewardsSubmissions.length;) { RewardsSubmission calldata rewardsSubmission = rewardsSubmissions[i]; uint256 nonce = submissionNonce[msg.sender]; bytes32 rewardsSubmissionHash = keccak256(abi.encode(msg.sender, nonce, rewardsSubmission)); - _validateRewardsSubmission(rewardsSubmission); + _validateRewardsSubmission( + rewardsSubmission.strategiesAndMultipliers, + rewardsSubmission.token, + rewardsSubmission.amount, + rewardsSubmission.startTimestamp, + rewardsSubmission.duration, + MAX_RETROACTIVE_LENGTH, + GENESIS_REWARDS_TIMESTAMP + ); isAVSRewardsSubmissionHash[msg.sender][rewardsSubmissionHash] = true; submissionNonce[msg.sender] = nonce + 1; emit AVSRewardsSubmissionCreated(msg.sender, nonce, rewardsSubmissionHash, rewardsSubmission); rewardsSubmission.token.safeTransferFrom(msg.sender, address(this), rewardsSubmission.amount); + + unchecked { + ++i; + } } } @@ -154,24 +175,77 @@ contract RewardsCoordinator is * a permissioned call based on isRewardsForAllSubmitter mapping. * @param rewardsSubmissions The rewards submissions being created */ - function createRewardsForAllSubmission(RewardsSubmission[] calldata rewardsSubmissions) - external - onlyWhenNotPaused(PAUSED_REWARDS_FOR_ALL_SUBMISSION) - onlyRewardsForAllSubmitter - nonReentrant - { - for (uint256 i = 0; i < rewardsSubmissions.length; i++) { + function createRewardsForAllSubmission( + RewardsSubmission[] calldata rewardsSubmissions + ) external onlyWhenNotPaused(PAUSED_REWARDS_FOR_ALL_SUBMISSION) onlyRewardsForAllSubmitter nonReentrant { + for (uint256 i = 0; i < rewardsSubmissions.length;) { RewardsSubmission calldata rewardsSubmission = rewardsSubmissions[i]; uint256 nonce = submissionNonce[msg.sender]; bytes32 rewardsSubmissionForAllHash = keccak256(abi.encode(msg.sender, nonce, rewardsSubmission)); - _validateRewardsSubmission(rewardsSubmission); + _validateRewardsSubmission( + rewardsSubmission.strategiesAndMultipliers, + rewardsSubmission.token, + rewardsSubmission.amount, + rewardsSubmission.startTimestamp, + rewardsSubmission.duration, + MAX_RETROACTIVE_LENGTH, + GENESIS_REWARDS_TIMESTAMP + ); isRewardsSubmissionForAllHash[msg.sender][rewardsSubmissionForAllHash] = true; submissionNonce[msg.sender] = nonce + 1; emit RewardsSubmissionForAllCreated(msg.sender, nonce, rewardsSubmissionForAllHash, rewardsSubmission); rewardsSubmission.token.safeTransferFrom(msg.sender, address(this), rewardsSubmission.amount); + + unchecked { + ++i; + } + } + } + + /** + * @notice Creates a new rewards submission on behalf of an AVS for a given operatorSet, + * to be split amongst the set of stakers delegated to operators who are + * registered to the msg.sender AVS and the given operatorSetId + * + * @param rewardsSubmissions The operatorSet rewards submission being created for + * + * @dev msg.sender is the AVS in the operatorSet the rewards submission is being made to + * @dev AVSs set their reward type depending on what metric they want rewards + * distributed proportional to + * @dev The tokens in the rewards submissions are sent to the `RewardsCoordinator` contract + * @dev Strategies of each rewards submission must be in ascending order of addresses to check for duplicates + */ + function rewardOperatorSetForRange( + OperatorSetRewardsSubmission[] calldata rewardsSubmissions + ) external onlyWhenNotPaused(PAUSED_REWARD_OPERATOR_SET) nonReentrant { + for (uint256 i = 0; i < rewardsSubmissions.length;) { + OperatorSetRewardsSubmission calldata rewardsSubmission = rewardsSubmissions[i]; + uint256 nonce = submissionNonce[msg.sender]; + bytes32 rewardsSubmissionHash = keccak256(abi.encode(msg.sender, nonce, rewardsSubmission)); + + require(avsDirectory.isOperatorSet(msg.sender, rewardsSubmission.operatorSetId), InvalidOperatorSet()); + _validateRewardsSubmission( + rewardsSubmission.strategiesAndMultipliers, + rewardsSubmission.token, + rewardsSubmission.amount, + rewardsSubmission.startTimestamp, + rewardsSubmission.duration, + OPERATOR_SET_MAX_RETROACTIVE_LENGTH, + OPERATOR_SET_GENESIS_REWARDS_TIMESTAMP + ); + + isAVSRewardsSubmissionHash[msg.sender][rewardsSubmissionHash] = true; + submissionNonce[msg.sender] = nonce + 1; + + emit OperatorSetRewardCreated(msg.sender, nonce, rewardsSubmissionHash, rewardsSubmission); + rewardsSubmission.token.safeTransferFrom(msg.sender, address(this), rewardsSubmission.amount); + + unchecked { + ++i; + } } } @@ -182,18 +256,23 @@ contract RewardsCoordinator is * by the token hopper contract from the Eigen Foundation * @param rewardsSubmissions The rewards submissions being created */ - function createRewardsForAllEarners(RewardsSubmission[] calldata rewardsSubmissions) - external - onlyWhenNotPaused(PAUSED_REWARD_ALL_STAKERS_AND_OPERATORS) - onlyRewardsForAllSubmitter - nonReentrant - { + function createRewardsForAllEarners( + RewardsSubmission[] calldata rewardsSubmissions + ) external onlyWhenNotPaused(PAUSED_REWARD_ALL_STAKERS_AND_OPERATORS) onlyRewardsForAllSubmitter nonReentrant { for (uint256 i = 0; i < rewardsSubmissions.length; i++) { RewardsSubmission calldata rewardsSubmission = rewardsSubmissions[i]; uint256 nonce = submissionNonce[msg.sender]; bytes32 rewardsSubmissionForAllEarnersHash = keccak256(abi.encode(msg.sender, nonce, rewardsSubmission)); - _validateRewardsSubmission(rewardsSubmission); + _validateRewardsSubmission( + rewardsSubmission.strategiesAndMultipliers, + rewardsSubmission.token, + rewardsSubmission.amount, + rewardsSubmission.startTimestamp, + rewardsSubmission.duration, + MAX_RETROACTIVE_LENGTH, + GENESIS_REWARDS_TIMESTAMP + ); isRewardsSubmissionForAllEarnersHash[msg.sender][rewardsSubmissionForAllEarnersHash] = true; submissionNonce[msg.sender] = nonce + 1; @@ -229,15 +308,12 @@ contract RewardsCoordinator is if (claimer == address(0)) { claimer = earner; } - require(msg.sender == claimer, "RewardsCoordinator.processClaim: caller is not valid claimer"); - for (uint256 i = 0; i < claim.tokenIndices.length; i++) { + require(msg.sender == claimer, InvalidClaimer()); + for (uint256 i = 0; i < claim.tokenIndices.length; ++i) { TokenTreeMerkleLeaf calldata tokenLeaf = claim.tokenLeaves[i]; uint256 currCumulativeClaimed = cumulativeClaimed[earner][tokenLeaf.token]; - require( - tokenLeaf.cumulativeEarnings > currCumulativeClaimed, - "RewardsCoordinator.processClaim: cumulativeEarnings must be gt than cumulativeClaimed" - ); + require(tokenLeaf.cumulativeEarnings > currCumulativeClaimed, EarningsNotGreaterThanClaimed()); // Calculate amount to claim and update cumulativeClaimed uint256 claimAmount = tokenLeaf.cumulativeEarnings - currCumulativeClaimed; @@ -259,13 +335,9 @@ contract RewardsCoordinator is uint32 rewardsCalculationEndTimestamp ) external onlyWhenNotPaused(PAUSED_SUBMIT_DISABLE_ROOTS) onlyRewardsUpdater { require( - rewardsCalculationEndTimestamp > currRewardsCalculationEndTimestamp, - "RewardsCoordinator.submitRoot: new root must be for newer calculated period" - ); - require( - rewardsCalculationEndTimestamp < block.timestamp, - "RewardsCoordinator.submitRoot: rewardsCalculationEndTimestamp cannot be in the future" + rewardsCalculationEndTimestamp > currRewardsCalculationEndTimestamp, NewRootMustBeForNewCalculatedPeriod() ); + require(rewardsCalculationEndTimestamp < block.timestamp, RewardsEndTimestampNotElapsed()); uint32 rootIndex = uint32(_distributionRoots.length); uint32 activatedAt = uint32(block.timestamp) + activationDelay; _distributionRoots.push( @@ -284,11 +356,13 @@ contract RewardsCoordinator is * @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(uint32 rootIndex) external onlyWhenNotPaused(PAUSED_SUBMIT_DISABLE_ROOTS) onlyRewardsUpdater { - require(rootIndex < _distributionRoots.length, "RewardsCoordinator.disableRoot: invalid rootIndex"); + function disableRoot( + uint32 rootIndex + ) external onlyWhenNotPaused(PAUSED_SUBMIT_DISABLE_ROOTS) onlyRewardsUpdater { + require(rootIndex < _distributionRoots.length, InvalidRootIndex()); DistributionRoot storage root = _distributionRoots[rootIndex]; - require(!root.disabled, "RewardsCoordinator.disableRoot: root already disabled"); - require(block.timestamp < root.activatedAt, "RewardsCoordinator.disableRoot: root already activated"); + require(!root.disabled, RootDisabled()); + require(block.timestamp < root.activatedAt, RootActivated()); root.disabled = true; emit DistributionRootDisabled(rootIndex); } @@ -298,19 +372,56 @@ contract RewardsCoordinator is * @param claimer The address of the entity that can call `processClaim` on behalf of the earner * @dev Only callable by the `earner` */ - function setClaimerFor(address claimer) external { + function setClaimerFor( + address claimer + ) external { address earner = msg.sender; address prevClaimer = claimerFor[earner]; claimerFor[earner] = claimer; emit ClaimerForSet(earner, prevClaimer, claimer); } + /** + * @notice Sets the commission an operator takes in bips for a given reward type and operatorSet + * @param operatorSet The operatorSet to update commission for + * @param rewardType The associated rewardType to update commission for + * @param commissionBips The commission in bips for the operator, must be <= MAX_COMMISSION_BIPS + * @return effectTimestamp The timestamp at which the operator commission update will take effect + * + * @dev The commission can range from 1 to 10000 + * @dev The commission update takes effect after 7 days + */ + function setOperatorCommissionBips( + OperatorSet calldata operatorSet, + RewardType rewardType, + uint16 commissionBips + ) external returns (uint32 effectTimestamp) { + require(commissionBips <= MAX_COMMISSION_BIPS, CommissionBipsExceedsMax()); + effectTimestamp = uint32(block.timestamp + OPERATOR_COMMISSION_ACTIVATION_DELAY); + OperatorCommissionUpdate[] storage commissionHistory = + operatorCommissionUpdates[msg.sender][operatorSet.avs][operatorSet.operatorSetId][rewardType]; + uint256 updateLength = commissionHistory.length; + + // If no updates or latest update is not for current effective timestamp, push a new commission update + // otherwise modify current storage + if (updateLength == 0 || commissionHistory[updateLength - 1].effectTimestamp != effectTimestamp) { + commissionHistory.push( + OperatorCommissionUpdate({commissionBips: commissionBips, effectTimestamp: effectTimestamp}) + ); + } else { + commissionHistory[updateLength - 1].commissionBips = commissionBips; + } + emit OperatorCommissionUpdated(msg.sender, operatorSet, rewardType, commissionBips, effectTimestamp); + } + /** * @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(uint32 _activationDelay) external onlyOwner { + function setActivationDelay( + uint32 _activationDelay + ) external onlyOwner { _setActivationDelay(_activationDelay); } @@ -319,7 +430,9 @@ contract RewardsCoordinator is * @dev Only callable by the contract owner * @param _globalCommissionBips The commission for all operators across all avss */ - function setGlobalOperatorCommission(uint16 _globalCommissionBips) external onlyOwner { + function setGlobalOperatorCommission( + uint16 _globalCommissionBips + ) external onlyOwner { _setGlobalOperatorCommission(_globalCommissionBips); } @@ -328,7 +441,9 @@ contract RewardsCoordinator is * @dev Only callable by the contract owner * @param _rewardsUpdater The address of the new rewardsUpdater */ - function setRewardsUpdater(address _rewardsUpdater) external onlyOwner { + function setRewardsUpdater( + address _rewardsUpdater + ) external onlyOwner { _setRewardsUpdater(_rewardsUpdater); } @@ -351,67 +466,53 @@ contract RewardsCoordinator is */ /** - * @notice Validate a RewardsSubmission. Called from both `createAVSRewardsSubmission` and `createRewardsForAllSubmission` + * @notice Validate a RewardsSubmission. Called from `createAVSRewardsSubmission`, `createRewardsForAllSubmission`, + * and `rewardOperatorSetForRange` + * + * @dev The callee must specify the `retroactiveLength` and `genesisRewardsTimestamp` as those values + * are different depending on the rewards submission type. */ - function _validateRewardsSubmission(RewardsSubmission calldata rewardsSubmission) internal view { - require( - rewardsSubmission.strategiesAndMultipliers.length > 0, - "RewardsCoordinator._validateRewardsSubmission: no strategies set" - ); - require(rewardsSubmission.amount > 0, "RewardsCoordinator._validateRewardsSubmission: amount cannot be 0"); - require( - rewardsSubmission.amount <= MAX_REWARDS_AMOUNT, - "RewardsCoordinator._validateRewardsSubmission: amount too large" - ); - require( - rewardsSubmission.duration <= MAX_REWARDS_DURATION, - "RewardsCoordinator._validateRewardsSubmission: duration exceeds MAX_REWARDS_DURATION" - ); - require( - rewardsSubmission.duration % CALCULATION_INTERVAL_SECONDS == 0, - "RewardsCoordinator._validateRewardsSubmission: duration must be a multiple of CALCULATION_INTERVAL_SECONDS" - ); - require( - rewardsSubmission.startTimestamp % CALCULATION_INTERVAL_SECONDS == 0, - "RewardsCoordinator._validateRewardsSubmission: startTimestamp must be a multiple of CALCULATION_INTERVAL_SECONDS" - ); + function _validateRewardsSubmission( + StrategyAndMultiplier[] calldata strategiesAndMultipliers, + IERC20 token, + uint256 amount, + uint32 startTimestamp, + uint32 duration, + uint32 maxRetroactiveLength, + uint32 genesisRewardsTimestamp + ) internal view { + require(strategiesAndMultipliers.length > 0, InputArrayLengthZero()); + require(amount > 0, AmountZero()); + require(amount <= MAX_REWARDS_AMOUNT, AmountExceedsMax()); + require(duration <= MAX_REWARDS_DURATION, DurationExceedsMax()); + require(duration % CALCULATION_INTERVAL_SECONDS == 0, DurationNotMultipleOfCalculationIntervalSeconds()); require( - block.timestamp - MAX_RETROACTIVE_LENGTH <= rewardsSubmission.startTimestamp - && GENESIS_REWARDS_TIMESTAMP <= rewardsSubmission.startTimestamp, - "RewardsCoordinator._validateRewardsSubmission: startTimestamp too far in the past" + startTimestamp % CALCULATION_INTERVAL_SECONDS == 0, StartTimestampNotMultipleOfCalculationIntervalSeconds() ); require( - rewardsSubmission.startTimestamp <= block.timestamp + MAX_FUTURE_LENGTH, - "RewardsCoordinator._validateRewardsSubmission: startTimestamp too far in the future" + block.timestamp - maxRetroactiveLength <= startTimestamp && genesisRewardsTimestamp <= startTimestamp, + StartTimestampTooFarInPast() ); + require(startTimestamp <= block.timestamp + MAX_FUTURE_LENGTH, StartTimestampTooFarInFuture()); // Require rewardsSubmission is for whitelisted strategy or beaconChainETHStrategy address currAddress = address(0); - for (uint256 i = 0; i < rewardsSubmission.strategiesAndMultipliers.length; ++i) { - IStrategy strategy = rewardsSubmission.strategiesAndMultipliers[i].strategy; + for (uint256 i = 0; i < strategiesAndMultipliers.length; ++i) { + IStrategy strategy = strategiesAndMultipliers[i].strategy; require( strategyManager.strategyIsWhitelistedForDeposit(strategy) || strategy == beaconChainETHStrategy, - "RewardsCoordinator._validateRewardsSubmission: invalid strategy considered" - ); - require( - currAddress < address(strategy), - "RewardsCoordinator._validateRewardsSubmission: strategies must be in ascending order to handle duplicates" + InvalidStrategy() ); + require(currAddress < address(strategy), StrategiesNotInAscendingOrder()); currAddress = address(strategy); } } function _checkClaim(RewardsMerkleClaim calldata claim, DistributionRoot memory root) internal view { - require(!root.disabled, "RewardsCoordinator._checkClaim: root is disabled"); - require(block.timestamp >= root.activatedAt, "RewardsCoordinator._checkClaim: root not activated yet"); - require( - claim.tokenIndices.length == claim.tokenTreeProofs.length, - "RewardsCoordinator._checkClaim: tokenIndices and tokenProofs length mismatch" - ); - require( - claim.tokenTreeProofs.length == claim.tokenLeaves.length, - "RewardsCoordinator._checkClaim: tokenTreeProofs and leaves length mismatch" - ); + require(!root.disabled, RootDisabled()); + require(block.timestamp >= root.activatedAt, RootNotActivated()); + require(claim.tokenIndices.length == claim.tokenTreeProofs.length, InputArrayLengthMismatch()); + require(claim.tokenTreeProofs.length == claim.tokenLeaves.length, InputArrayLengthMismatch()); // Verify inclusion of earners leaf (earner, earnerTokenRoot) in the distribution root _verifyEarnerClaimProof({ @@ -447,10 +548,7 @@ contract RewardsCoordinator is ) internal pure { // Validate index size so that there aren't multiple valid indices for the given proof // index can't be greater than 2**(tokenProof/32) - require( - tokenLeafIndex < (1 << (tokenProof.length / 32)), - "RewardsCoordinator._verifyTokenClaim: invalid tokenLeafIndex" - ); + require(tokenLeafIndex < (1 << (tokenProof.length / 32)), InvalidTokenLeafIndex()); // Verify inclusion of token leaf bytes32 tokenLeafHash = calculateTokenLeafHash(tokenLeaf); @@ -461,7 +559,7 @@ contract RewardsCoordinator is proof: tokenProof, leaf: tokenLeafHash }), - "RewardsCoordinator._verifyTokenClaim: invalid token claim proof" + InvalidClaimProof() ); } @@ -482,10 +580,7 @@ contract RewardsCoordinator is ) internal pure { // Validate index size so that there aren't multiple valid indices for the given proof // index can't be greater than 2**(earnerProof/32) - require( - earnerLeafIndex < (1 << (earnerProof.length / 32)), - "RewardsCoordinator._verifyEarnerClaimProof: invalid earnerLeafIndex" - ); + require(earnerLeafIndex < (1 << (earnerProof.length / 32)), InvalidEarnerLeafIndex()); // Verify inclusion of earner leaf bytes32 earnerLeafHash = calculateEarnerLeafHash(earnerLeaf); // forgefmt: disable-next-item @@ -496,21 +591,27 @@ contract RewardsCoordinator is proof: earnerProof, leaf: earnerLeafHash }), - "RewardsCoordinator._verifyEarnerClaimProof: invalid earner claim proof" + InvalidClaimProof() ); } - function _setActivationDelay(uint32 _activationDelay) internal { + function _setActivationDelay( + uint32 _activationDelay + ) internal { emit ActivationDelaySet(activationDelay, _activationDelay); activationDelay = _activationDelay; } - function _setGlobalOperatorCommission(uint16 _globalCommissionBips) internal { + function _setGlobalOperatorCommission( + uint16 _globalCommissionBips + ) internal { emit GlobalCommissionBipsSet(globalOperatorCommissionBips, _globalCommissionBips); globalOperatorCommissionBips = _globalCommissionBips; } - function _setRewardsUpdater(address _rewardsUpdater) internal { + function _setRewardsUpdater( + address _rewardsUpdater + ) internal { emit RewardsUpdaterSet(rewardsUpdater, _rewardsUpdater); rewardsUpdater = _rewardsUpdater; } @@ -522,33 +623,56 @@ contract RewardsCoordinator is */ /// @notice return the hash of the earner's leaf - function calculateEarnerLeafHash(EarnerTreeMerkleLeaf calldata leaf) public pure returns (bytes32) { + function calculateEarnerLeafHash( + EarnerTreeMerkleLeaf calldata leaf + ) public pure returns (bytes32) { return keccak256(abi.encodePacked(EARNER_LEAF_SALT, leaf.earner, leaf.earnerTokenRoot)); } /// @notice returns the hash of the earner's token leaf - function calculateTokenLeafHash(TokenTreeMerkleLeaf calldata leaf) public pure returns (bytes32) { + function calculateTokenLeafHash( + TokenTreeMerkleLeaf calldata leaf + ) public pure returns (bytes32) { return keccak256(abi.encodePacked(TOKEN_LEAF_SALT, leaf.token, leaf.cumulativeEarnings)); } /// @notice returns 'true' if the claim would currently pass the check in `processClaims` /// but will revert if not valid - function checkClaim(RewardsMerkleClaim calldata claim) public view returns (bool) { + function checkClaim( + RewardsMerkleClaim calldata claim + ) public view returns (bool) { _checkClaim(claim, _distributionRoots[claim.rootIndex]); return true; } - /// @notice the commission for a specific operator for a specific avs + /// @notice the commission for an operator for a specific operatorSet and reward type /// NOTE: Currently unused and simply returns the globalOperatorCommissionBips value but will be used in future release - function operatorCommissionBips(address operator, address avs) external view returns (uint16) { - return globalOperatorCommissionBips; + function getOperatorCommissionBips( + address operator, + OperatorSet calldata operatorSet, + RewardType rewardType + ) external view returns (uint16) { + // if no value set, default to globalOperatorCommissionBips + uint16 commissionBips = globalOperatorCommissionBips; + OperatorCommissionUpdate[] memory commissionHistory = + operatorCommissionUpdates[operator][operatorSet.avs][operatorSet.operatorSetId][rewardType]; + + for (uint256 i = commissionHistory.length; i > 0; --i) { + if (commissionHistory[i - 1].effectTimestamp <= uint32(block.timestamp)) { + commissionBips = commissionHistory[i - 1].commissionBips; + break; + } + } + return commissionBips; } function getDistributionRootsLength() public view returns (uint256) { return _distributionRoots.length; } - function getDistributionRootAtIndex(uint256 index) external view returns (DistributionRoot memory) { + function getDistributionRootAtIndex( + uint256 index + ) external view returns (DistributionRoot memory) { return _distributionRoots[index]; } @@ -569,13 +693,24 @@ contract RewardsCoordinator is } /// @notice loop through distribution roots from reverse and return hash - function getRootIndexFromHash(bytes32 rootHash) public view returns (uint32) { + function getRootIndexFromHash( + bytes32 rootHash + ) public view returns (uint32) { for (uint32 i = uint32(_distributionRoots.length); i > 0; i--) { if (_distributionRoots[i - 1].root == rootHash) { return i - 1; } } - revert("RewardsCoordinator.getRootIndexFromHash: root not found"); + revert InvalidRoot(); + } + + /// @notice returns the length of the operator commission update history + function getOperatorCommissionUpdateHistoryLength( + address operator, + OperatorSet calldata operatorSet, + RewardType rewardType + ) external view returns (uint256) { + return operatorCommissionUpdates[operator][operatorSet.avs][operatorSet.operatorSetId][rewardType].length; } /** diff --git a/src/contracts/core/RewardsCoordinatorStorage.sol b/src/contracts/core/RewardsCoordinatorStorage.sol index 3d019ff92..5a8a677b1 100644 --- a/src/contracts/core/RewardsCoordinatorStorage.sol +++ b/src/contracts/core/RewardsCoordinatorStorage.sol @@ -1,8 +1,9 @@ // SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.12; +pragma solidity ^0.8.27; import "../interfaces/IStrategyManager.sol"; import "../interfaces/IDelegationManager.sol"; +import "../interfaces/IAVSDirectory.sol"; import "../interfaces/IRewardsCoordinator.sol"; /** @@ -18,26 +19,38 @@ abstract contract RewardsCoordinatorStorage is IRewardsCoordinator { * */ + // Constants for all reward types /// @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 week + /// @dev ALL RewardsSubmission durations must be multiples of this interval. This is going to be configured to 1 week uint32 public immutable CALCULATION_INTERVAL_SECONDS; - /// @notice The maximum amount of time (seconds) that a rewards submission can span over + /// @notice The maximum amount of time (seconds) that ALL rewards submission can span over uint32 public immutable MAX_REWARDS_DURATION; - /// @notice max amount of time (seconds) that a rewards submission can start in the past - uint32 public immutable MAX_RETROACTIVE_LENGTH; - /// @notice max amount of time (seconds) that a rewards submission can start in the future + /// @notice max amount of time (seconds) that ALL rewards submission can start in the future uint32 public immutable MAX_FUTURE_LENGTH; - /// @notice absolute min timestamp (seconds) that a rewards submission can start at - uint32 public immutable GENESIS_REWARDS_TIMESTAMP; /// @notice The cadence at which a snapshot is taken offchain for calculating rewards distributions uint32 internal constant SNAPSHOT_CADENCE = 1 days; + // V1 Rewards Constants + /// @notice absolute min timestamp (seconds) that a V1 rewards submission can start at + uint32 public immutable GENESIS_REWARDS_TIMESTAMP; + /// @notice max amount of time (seconds) that a V1 rewards submission can start in the past + uint32 public immutable MAX_RETROACTIVE_LENGTH; + + // OperatorSet Rewards Constants + /// @notice absolute min timestamp (seconds) that an operatorSet rewards submission can start at + uint32 public immutable OPERATOR_SET_GENESIS_REWARDS_TIMESTAMP; + /// @notice max of time (seconds) that an operatorSet rewards submission can start in the past + uint32 public immutable OPERATOR_SET_MAX_RETROACTIVE_LENGTH; + /// @notice The DelegationManager contract for EigenLayer IDelegationManager public immutable delegationManager; /// @notice The StrategyManager contract for EigenLayer IStrategyManager public immutable strategyManager; + /// @notice The AVSDirectory contract for EigenLayer + IAVSDirectory public immutable avsDirectory; + /** * * STORAGE @@ -79,7 +92,7 @@ abstract contract RewardsCoordinatorStorage is IRewardsCoordinator { /// @notice Mapping: avs => avsRewardsSubmissionHash => bool to check if rewards submission hash has been submitted mapping(address => mapping(bytes32 => bool)) public isAVSRewardsSubmissionHash; - /// @notice Mapping: avs => rewardsSubmissionForAllHash => bool to check if rewards submission hash for all has been submitted + /// @notice Mapping: rewardsSubmitterForAll => rewardsSubmissionForAllHash => bool to check if rewards submission hash for all has been submitted mapping(address => mapping(bytes32 => bool)) public isRewardsSubmissionForAllHash; /// @notice Mapping: address => bool to check if the address is permissioned to call createRewardsForAllSubmission @@ -88,15 +101,24 @@ abstract contract RewardsCoordinatorStorage is IRewardsCoordinator { /// @notice Mapping: avs => rewardsSubmissionForAllEarnersHash => bool to check /// if rewards submission hash for all stakers and operators has been submitted mapping(address => mapping(bytes32 => bool)) public isRewardsSubmissionForAllEarnersHash; + /// @notice Mapping: avs => rewardsSubmissionHash => bool to check if operatorSet rewards submission hash has been submitted + mapping(address => mapping(bytes32 => bool)) isOperatorSetRewardsSubmissionHash; + + /// @notice Mapping: operator => avs => operatorSetId => OperatorCommissionUpdate history + mapping(address => mapping(address => mapping(uint32 => mapping(RewardType => OperatorCommissionUpdate[])))) public + operatorCommissionUpdates; constructor( IDelegationManager _delegationManager, IStrategyManager _strategyManager, + IAVSDirectory _avsDirectory, uint32 _CALCULATION_INTERVAL_SECONDS, uint32 _MAX_REWARDS_DURATION, uint32 _MAX_RETROACTIVE_LENGTH, uint32 _MAX_FUTURE_LENGTH, - uint32 _GENESIS_REWARDS_TIMESTAMP + uint32 _GENESIS_REWARDS_TIMESTAMP, + uint32 _OPERATOR_SET_GENESIS_REWARDS_TIMESTAMP, + uint32 _OPERATOR_SET_MAX_RETROACTIVE_LENGTH ) { require( _GENESIS_REWARDS_TIMESTAMP % _CALCULATION_INTERVAL_SECONDS == 0, @@ -106,13 +128,20 @@ abstract contract RewardsCoordinatorStorage is IRewardsCoordinator { _CALCULATION_INTERVAL_SECONDS % SNAPSHOT_CADENCE == 0, "RewardsCoordinator: CALCULATION_INTERVAL_SECONDS must be a multiple of SNAPSHOT_CADENCE" ); + require( + _OPERATOR_SET_GENESIS_REWARDS_TIMESTAMP % _CALCULATION_INTERVAL_SECONDS == 0, + "RewardsCoordinator: OPERATOR_SET_GENESIS_REWARDS_TIMESTAMP must be a multiple of CALCULATION_INTERVAL_SECONDS" + ); delegationManager = _delegationManager; strategyManager = _strategyManager; + avsDirectory = _avsDirectory; CALCULATION_INTERVAL_SECONDS = _CALCULATION_INTERVAL_SECONDS; MAX_REWARDS_DURATION = _MAX_REWARDS_DURATION; MAX_RETROACTIVE_LENGTH = _MAX_RETROACTIVE_LENGTH; MAX_FUTURE_LENGTH = _MAX_FUTURE_LENGTH; GENESIS_REWARDS_TIMESTAMP = _GENESIS_REWARDS_TIMESTAMP; + OPERATOR_SET_GENESIS_REWARDS_TIMESTAMP = _OPERATOR_SET_GENESIS_REWARDS_TIMESTAMP; + OPERATOR_SET_MAX_RETROACTIVE_LENGTH = _OPERATOR_SET_MAX_RETROACTIVE_LENGTH; } /** @@ -120,5 +149,5 @@ abstract contract RewardsCoordinatorStorage is IRewardsCoordinator { * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ - uint256[39] private __gap; + uint256[37] private __gap; } diff --git a/src/contracts/core/Slasher.sol b/src/contracts/core/Slasher.sol index 9a05a560a..85cc9a2ae 100644 --- a/src/contracts/core/Slasher.sol +++ b/src/contracts/core/Slasher.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.12; +pragma solidity ^0.8.27; import "../interfaces/ISlasher.sol"; import "../interfaces/IDelegationManager.sol"; @@ -29,11 +29,17 @@ contract Slasher is Initializable, OwnableUpgradeable, ISlasher, Pausable { function initialize(address, IPauserRegistry, uint256) external {} - function optIntoSlashing(address) external {} + function optIntoSlashing( + address + ) external {} - function freezeOperator(address) external {} + function freezeOperator( + address + ) external {} - function resetFrozenStatus(address[] calldata) external {} + function resetFrozenStatus( + address[] calldata + ) external {} function recordFirstStakeUpdate(address, uint32) external {} @@ -45,7 +51,9 @@ contract Slasher is Initializable, OwnableUpgradeable, ISlasher, Pausable { function delegation() external view returns (IDelegationManager) {} - function isFrozen(address) external view returns (bool) {} + function isFrozen( + address + ) external view returns (bool) {} function canSlash(address, address) external view returns (bool) {} @@ -59,13 +67,17 @@ contract Slasher is Initializable, OwnableUpgradeable, ISlasher, Pausable { function operatorToMiddlewareTimes(address, uint256) external view returns (MiddlewareTimes memory) {} - function middlewareTimesLength(address) external view returns (uint256) {} + function middlewareTimesLength( + address + ) external view returns (uint256) {} function getMiddlewareTimesIndexStalestUpdateBlock(address, uint32) external view returns (uint32) {} function getMiddlewareTimesIndexServeUntilBlock(address, uint32) external view returns (uint32) {} - function operatorWhitelistedContractsLinkedListSize(address) external view returns (uint256) {} + function operatorWhitelistedContractsLinkedListSize( + address + ) external view returns (uint256) {} function operatorWhitelistedContractsLinkedListEntry( address, diff --git a/src/contracts/core/StakeRootCompendium.sol b/src/contracts/core/StakeRootCompendium.sol new file mode 100644 index 000000000..14f2a137c --- /dev/null +++ b/src/contracts/core/StakeRootCompendium.sol @@ -0,0 +1,627 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.27; + +import "@openzeppelin/contracts/utils/structs/EnumerableMap.sol"; +import "../interfaces/IStrategy.sol"; +import "../libraries/Merkle.sol"; +import "./StakeRootCompendiumStorage.sol"; + +contract StakeRootCompendium is StakeRootCompendiumStorage { + using Snapshots for Snapshots.History; + using EnumerableMap for EnumerableMap.AddressToUintMap; + using EnumerableSet for EnumerableSet.Bytes32Set; + + constructor( + IDelegationManager _delegationManager, + IAVSDirectory _avsDirectory, + IAllocationManager _allocationManager, + uint256 _minBalanceThreshold, + uint256 _minPrepaidProofs, + address _verifier, + bytes32 _imageId + ) + StakeRootCompendiumStorage( + _delegationManager, + _avsDirectory, + _allocationManager, + _minBalanceThreshold, + _minPrepaidProofs, + _verifier, + _imageId + ) + {} + + function initialize( + address _owner, + address _rootConfirmer, + uint32 _proofIntervalSeconds, + ChargeParams memory _chargeParams + ) public initializer { + __Ownable_init(); + _transferOwnership(_owner); + + rootConfirmer = _rootConfirmer; + chargeParams = _chargeParams; + cumulativeChargeParams.proofIntervalSeconds = _proofIntervalSeconds; + + stakeRootSubmissions.push(StakeRootSubmission({ + calculationTimestamp: 0, + submissionTimestamp: uint32(block.timestamp), + stakeRoot: bytes32(0), + confirmed: false + })); + } + + /// OPERATORSET CONFIGURATION + + /// @inheritdoc IStakeRootCompendium + function deposit( + OperatorSet calldata operatorSet + ) external payable { + DepositInfo storage depositInfo = depositInfos[operatorSet.avs][operatorSet.operatorSetId]; + if (!_isInStakeTree(operatorSet)) { + (, uint256 cumulativeChargePerOperatorSet, uint256 cumulativeChargePerStrategy) = + _calculateCumulativeCharges(); + + depositInfo.lastDemandIncreaseTimestamp = uint32(block.timestamp); + depositInfo.cumulativeChargePerOperatorSetLastPaid = uint96(cumulativeChargePerOperatorSet); + depositInfo.cumulativeChargePerStrategyLastPaid = uint96(cumulativeChargePerStrategy); + + _updateTotalStrategies( + 0, operatorSetToStrategyAndMultipliers[operatorSet.avs][operatorSet.operatorSetId].length() + ); + + operatorSetToIndex[operatorSet.avs][operatorSet.operatorSetId].push( + uint32(block.timestamp), uint224(operatorSets.length) + ); + + operatorSets.push(operatorSet); + } + + depositInfo.balance += uint96(msg.value); + // note that they've shown increased demand for proofs + depositInfo.lastDemandIncreaseTimestamp = uint32(block.timestamp); + // make sure they have enough to pay for MIN_PROOFS_PREPAID + require( + depositInfo.balance + >= minDepositBalance( + operatorSetToStrategyAndMultipliers[operatorSet.avs][operatorSet.operatorSetId].length() + ), + InsufficientDepositBalance() + ); + } + + /// @inheritdoc IStakeRootCompendium + function addOrModifyStrategiesAndMultipliers( + uint32 operatorSetId, + StrategyAndMultiplier[] calldata _strategiesAndMultipliers + ) external { + OperatorSet memory operatorSet = OperatorSet({avs: msg.sender, operatorSetId: operatorSetId}); + // update the deposit balance for the operator set whenever number of strategies is changed + _updateDepositInfo(operatorSet); + + EnumerableMap.AddressToUintMap storage strategiesAndMultipliers = + operatorSetToStrategyAndMultipliers[operatorSet.avs][operatorSet.operatorSetId]; + + uint256 numStrategiesBefore = strategiesAndMultipliers.length(); + // set the strategies and multipliers for the operator set + for (uint256 i = 0; i < _strategiesAndMultipliers.length; i++) { + strategiesAndMultipliers.set( + address(_strategiesAndMultipliers[i].strategy), uint256(_strategiesAndMultipliers[i].multiplier) + ); + } + uint256 numStrategiesAfter = strategiesAndMultipliers.length(); + + DepositInfo storage depositInfo = depositInfos[operatorSet.avs][operatorSet.operatorSetId]; + + // make sure they have enough to pay for MIN_PREPAID_PROOFS + require(depositInfo.balance >= minDepositBalance(numStrategiesAfter), InsufficientDepositBalance()); + // note that they've shown increased demand for proofs + depositInfo.lastDemandIncreaseTimestamp = uint32(block.timestamp); + + // only adding new strategies to count + _updateTotalStrategies(numStrategiesBefore, numStrategiesAfter); + } + + /// @inheritdoc IStakeRootCompendium + function removeStrategiesAndMultipliers(uint32 operatorSetId, IStrategy[] calldata strategies) external { + OperatorSet memory operatorSet = OperatorSet({avs: msg.sender, operatorSetId: operatorSetId}); + // update the deposit balance for the operator set whenever number of strategies is changed + _updateDepositInfo(operatorSet); + + EnumerableMap.AddressToUintMap storage strategiesAndMultipliers = + operatorSetToStrategyAndMultipliers[operatorSet.avs][operatorSetId]; + + // note below either all strategies are removed or none are removed and transaction reverts + uint256 numStrategiesBefore = strategiesAndMultipliers.length(); + for (uint256 i = 0; i < strategies.length; i++) { + require(strategiesAndMultipliers.remove(address(strategies[i])), NonexistentStrategy()); + } + + _updateTotalStrategies(numStrategiesBefore, numStrategiesBefore - strategies.length); + } + + /// @inheritdoc IStakeRootCompendium + function setOperatorSetExtraData(uint32 operatorSetId, bytes32 extraData) external { + require(_isInStakeTree(OperatorSet({avs: msg.sender, operatorSetId: operatorSetId})), NotInStakeTree()); + operatorSetExtraDatas[msg.sender][operatorSetId] = extraData; + } + + /// @inheritdoc IStakeRootCompendium + function setOperatorExtraData(uint32 operatorSetId, address operator, bytes32 extraData) external { + require(_isInStakeTree(OperatorSet({avs: msg.sender, operatorSetId: operatorSetId})), NotInStakeTree()); + operatorExtraDatas[msg.sender][operatorSetId][operator] = extraData; + } + + /// @inheritdoc IStakeRootCompendium + function withdraw(uint32 operatorSetId, uint256 amount) external payable returns (uint256) { + OperatorSet memory operatorSet = OperatorSet({avs: msg.sender, operatorSetId: operatorSetId}); + require(canWithdrawDepositBalance(operatorSet), OperatorSetNotOldEnough()); + + // debt any pending charge + uint256 balance = _updateDepositInfo(operatorSet); + if (balance < MIN_BALANCE_THRESHOLD + amount) { + // withdraw all to avoid deposit balance dropping below minimum + amount = balance; + // remove from stake tree if applicable + _removeFromStakeTree(operatorSet); + } + // debt the withdraw amount + depositInfos[msg.sender][operatorSetId].balance -= uint96(amount); + + _safeTransferETH(msg.sender, amount); + + return amount; + } + + /// CHARGE MANAGEMENT + + /// @inheritdoc IStakeRootCompendium + function removeOperatorSetsFromStakeTree( + OperatorSet[] calldata operatorSetsToRemove + ) external { + uint256 penalty = 0; + for (uint256 i = 0; i < operatorSetsToRemove.length; i++) { + if (_isInStakeTree(operatorSetsToRemove[i])) { + uint256 depositBalance = _updateDepositInfo(operatorSetsToRemove[i]); + // remove from stake tree if their deposit balance is below the minimum + if (depositBalance < MIN_BALANCE_THRESHOLD) { + _removeFromStakeTree(operatorSetsToRemove[i]); + penalty += depositBalance; + } + } + } + // note this reward is subject to a race condition where anyone can claim the penalty if they submit their transaction first + // it is the caller's responsibility to use private mempool to protect themselves from reverted transactions + _safeTransferETH(msg.sender, penalty); + } + + /// POSTING ROOTS AND BLACKLISTING + + /// @inheritdoc IStakeRootCompendium + function verifyStakeRoot( + uint256 calculationTimestamp, + bytes32 stakeRoot, + address chargeRecipient, + uint256 indexChargePerProof, + Proof calldata _proof + ) external { + require( + calculationTimestamp % cumulativeChargeParams.proofIntervalSeconds == 0, + TimestampNotMultipleOfProofInterval() + ); + // no length check here is ok because the initializer adds a default submission + require( + stakeRootSubmissions[stakeRootSubmissions.length - 1].calculationTimestamp != calculationTimestamp, + TimestampAlreadyPosted() + ); + // credit the charge recipient + Snapshots.Snapshot memory _snapshot = chargePerProof._snapshots[indexChargePerProof]; + require( + _snapshot._key <= calculationTimestamp, TimestampOfIndexChargePerProofIsGreaterThanCalculationTimestamp() + ); + require( + chargePerProof.length() == indexChargePerProof + 1 + || uint256(chargePerProof._snapshots[indexChargePerProof + 1]._key) > calculationTimestamp, + IndexChargePerProofNotValid() + ); + stakeRootSubmissions.push( + StakeRootSubmission({ + calculationTimestamp: uint32(calculationTimestamp), + submissionTimestamp: uint32(block.timestamp), + stakeRoot: stakeRoot, + confirmed: false + }) + ); + + _safeTransferETH(chargeRecipient, _snapshot._value); + // interactions + + // note verify will be an external call, so adding to the end to apply the check, effect, interaction pattern to avoid reentrancy + // TODO: verify proof + // TODO: prevent race incentives and public mempool sniping, eg embed chargeRecipient in the proof + } + + /// @inheritdoc IStakeRootCompendium + function confirmStakeRoot(uint32 index, bytes32 stakeRoot) external { + require(msg.sender == rootConfirmer, OnlyRootConfirmerCanConfirm()); + IStakeRootCompendium.StakeRootSubmission storage stakeRootSubmission = stakeRootSubmissions[index]; + require(stakeRootSubmission.stakeRoot == stakeRoot, StakeRootDoesNotMatch()); + require(stakeRootSubmission.confirmed, TimestampAlreadyConfirmed()); + stakeRootSubmission.confirmed = true; + } + + /// SET FUNCTIONS + + /// @inheritdoc IStakeRootCompendium + function setMaxChargePerProof( + uint96 _maxChargePerProof + ) external onlyOwner { + require(_maxChargePerProof >= chargePerProof.latest(), MaxTotalChargeMustBeGreaterThanTheCurrentTotalCharge()); + chargeParams.maxChargePerProof = _maxChargePerProof; + } + + /// @inheritdoc IStakeRootCompendium + function setChargePerProof(uint96 _chargePerStrategy, uint96 _chargePerOperatorSet) external onlyOwner { + _updateCumulativeCharge(); + ChargeParams storage params = chargeParams; + params.chargePerStrategy = _chargePerStrategy; + params.chargePerOperatorSet = _chargePerOperatorSet; + _updateChargePerProof(); + } + + /// @inheritdoc IStakeRootCompendium + function setProofIntervalSeconds( + uint32 _proofIntervalSeconds + ) external onlyOwner { + _updateCumulativeCharge(); + // we must not interrupt pending proof calculations by rugging the outstanding calculationTimestamps + require( + stakeRootSubmissions[stakeRootSubmissions.length - 1].calculationTimestamp + == cumulativeChargeParams.lastUpdateTimestamp, + NoProofsThatHaveBeenChargedButNotSubmitted() + ); + cumulativeChargeParams.proofIntervalSeconds = _proofIntervalSeconds; + } + + /// @inheritdoc IStakeRootCompendium + function setRootConfirmer( + address _rootConfirmer + ) public onlyOwner { + rootConfirmer = _rootConfirmer; + } + + /// INTERNAL FUNCTIONS + + function _removeFromStakeTree( + OperatorSet memory operatorSet + ) internal { + OperatorSet memory substituteOperatorSet = operatorSets[operatorSets.length - 1]; + Snapshots.History storage snapshotHistory = operatorSetToIndex[operatorSet.avs][operatorSet.operatorSetId]; + uint224 operatorSetIndex = snapshotHistory.latest(); + operatorSets[operatorSetIndex] = substituteOperatorSet; + operatorSets.pop(); + + // update the index of the operator sets + // note when there is only one operator set left, the index will not be updated as the operator set will be removed in the next step + operatorSetToIndex[substituteOperatorSet.avs][substituteOperatorSet.operatorSetId].push( + uint32(block.timestamp), operatorSetIndex + ); + snapshotHistory.push(uint32(block.timestamp), REMOVED_INDEX); + + depositInfos[operatorSet.avs][operatorSet.operatorSetId].balance = 0; + + _updateTotalStrategies( + operatorSetToStrategyAndMultipliers[operatorSet.avs][operatorSet.operatorSetId].length(), 0 + ); + } + + function _updateTotalStrategies(uint256 _countStrategiesBefore, uint256 _countStrategiesAfter) internal { + totalStrategies = totalStrategies - _countStrategiesBefore + _countStrategiesAfter; + _updateChargePerProof(); + } + + function _updateChargePerProof() internal { + // note if totalStrategies is 0, the charge per proof will be 0, and provers should not post a proof + uint256 _chargePerProof = + operatorSets.length * chargeParams.chargePerOperatorSet + totalStrategies * chargeParams.chargePerStrategy; + require(_chargePerProof <= chargeParams.maxChargePerProof, ChargePerProofExceedsMax()); + chargePerProof.push(uint32(block.timestamp), uint224(_chargePerProof)); + } + + function _calculateCumulativeCharges() internal view returns (uint32, uint96, uint96) { + // calculate the total charge since the last update up until the latest calculation timestamp + // note that there may be no corresponding stakeRootSubmission for the latest calculation timestamp + // but if the calculationTimestamp is in the past, then it should be charged for, since proofs are being generated + uint32 latestCalculationTimestamp = + uint32(block.timestamp) - uint32(block.timestamp % cumulativeChargeParams.proofIntervalSeconds); + + if (cumulativeChargeParams.lastUpdateTimestamp == latestCalculationTimestamp) { + return ( + latestCalculationTimestamp, + cumulativeChargeParams.chargePerOperatorSet, + cumulativeChargeParams.chargePerStrategy + ); + } + + uint256 numProofs = (latestCalculationTimestamp - cumulativeChargeParams.lastUpdateTimestamp) + / cumulativeChargeParams.proofIntervalSeconds; + + return ( + latestCalculationTimestamp, + uint96(cumulativeChargeParams.chargePerOperatorSet + chargeParams.chargePerOperatorSet * numProofs), + uint96(cumulativeChargeParams.chargePerStrategy + chargeParams.chargePerStrategy * numProofs) + ); + } + + function _updateCumulativeCharge() internal { + (uint32 lastUpdateTimestamp, uint96 cumulativeChargePerOperatorSet, uint96 cumulativeChargePerStrategy) = + _calculateCumulativeCharges(); + + cumulativeChargeParams = CumulativeChargeParams({ + chargePerOperatorSet: cumulativeChargePerOperatorSet, + chargePerStrategy: cumulativeChargePerStrategy, + lastUpdateTimestamp: lastUpdateTimestamp, + proofIntervalSeconds: cumulativeChargeParams.proofIntervalSeconds + }); + } + + // updates the deposit balance for the operator set and returns the penalty if the operator set has fallen below the minimum deposit balance + function _updateDepositInfo( + OperatorSet memory operatorSet + ) internal returns (uint256 balance) { + require(_isInStakeTree(operatorSet), NotInStakeTree()); + + (, uint256 cumulativeChargePerOperatorSet, uint256 cumulativeChargePerStrategy) = _calculateCumulativeCharges(); + DepositInfo storage depositInfo = depositInfos[operatorSet.avs][operatorSet.operatorSetId]; + + // subtract new total charge from last paid total charge + uint256 pendingCharge = cumulativeChargePerOperatorSet - depositInfo.cumulativeChargePerOperatorSetLastPaid + + ( + (cumulativeChargePerStrategy - depositInfo.cumulativeChargePerStrategyLastPaid) + * operatorSetToStrategyAndMultipliers[operatorSet.avs][operatorSet.operatorSetId].length() + ); + + balance = depositInfo.balance > pendingCharge ? depositInfo.balance - pendingCharge : 0; + + depositInfo.balance = uint96(balance); + depositInfo.cumulativeChargePerOperatorSetLastPaid = uint96(cumulativeChargePerOperatorSet); + depositInfo.cumulativeChargePerOperatorSetLastPaid = uint96(cumulativeChargePerStrategy); + } + + function _getStrategiesAndMultipliers( + OperatorSet memory operatorSet + ) internal view returns (IStrategy[] memory, uint256[] memory) { + IStrategy[] memory strategies = + new IStrategy[](operatorSetToStrategyAndMultipliers[operatorSet.avs][operatorSet.operatorSetId].length()); + uint256[] memory multipliers = new uint256[](strategies.length); + for (uint256 i = 0; i < strategies.length; i++) { + (address strategy, uint256 multiplier) = + operatorSetToStrategyAndMultipliers[operatorSet.avs][operatorSet.operatorSetId].at(i); + strategies[i] = IStrategy(strategy); + multipliers[i] = multiplier; + } + return (strategies, multipliers); + } + + function _getStakes( + OperatorSet memory operatorSet, + IStrategy[] memory strategies, + uint256[] memory multipliers, + address operator + ) internal view returns (uint256, uint256) { + // calculate the weighted sum of the operator's shares for the strategies given the multipliers + uint256 delegatedStake = 0; + uint256 slashableStake = 0; + { + uint256[] memory delegatedShares = delegationManager.getOperatorDelegatedShares(operator, strategies); + + (uint64[] memory totalMagnitudes, uint64[] memory allocatedMagnitudes) = + allocationManager.getTotalAndAllocatedMagnitudes(operator, operatorSet, strategies); + + for (uint256 i = 0; i < strategies.length; i++) { + delegatedStake += delegatedShares[i] * totalMagnitudes[i] / 1 ether * multipliers[i]; + slashableStake += delegatedShares[i] * allocatedMagnitudes[i] / 1 ether * multipliers[i]; + } + } + return (delegatedStake, slashableStake); + } + + function _isInStakeTree( + OperatorSet memory operatorSet + ) internal view returns (bool) { + (bool exists,, uint224 index) = operatorSetToIndex[operatorSet.avs][operatorSet.operatorSetId].latestSnapshot(); + return exists && index != REMOVED_INDEX; + } + + // VIEW FUNCTIONS + + /// VIEW FUNCTIONS + + /// @inheritdoc IStakeRootCompendium + function minDepositBalance( + uint256 numStrategies + ) public view returns (uint256) { + ChargeParams memory charges = chargeParams; + return (numStrategies * charges.chargePerStrategy + charges.chargePerOperatorSet) * MIN_PREPAID_PROOFS; + } + + /// @inheritdoc IStakeRootCompendium + function canWithdrawDepositBalance( + OperatorSet memory operatorSet + ) public view returns (bool) { + // they must have paid for all of their prepaid proofs before withdrawing after a demand increase + return block.timestamp + > depositInfos[operatorSet.avs][operatorSet.operatorSetId].lastDemandIncreaseTimestamp + + MIN_PREPAID_PROOFS * cumulativeChargeParams.proofIntervalSeconds; + } + + /// @inheritdoc IStakeRootCompendium + function getNumStakeRootSubmissions() external view returns (uint256) { + return stakeRootSubmissions.length; + } + + /// @inheritdoc IStakeRootCompendium + function getStakeRootSubmission( + uint32 index + ) external view returns (StakeRootSubmission memory) { + return stakeRootSubmissions[index]; + } + + /// @inheritdoc IStakeRootCompendium + function getNumOperatorSets() external view returns (uint256) { + return operatorSets.length; + } + + /// @inheritdoc IStakeRootCompendium + function getOperatorSetIndexAtTimestamp(OperatorSet memory operatorSet, uint32 timestamp) + external + view + returns (uint224) + { + return operatorSetToIndex[operatorSet.avs][operatorSet.operatorSetId].upperLookup(timestamp); + } + + /// @inheritdoc IStakeRootCompendium + function getStakes( + OperatorSet calldata operatorSet, + address operator + ) external view returns (uint256 delegatedStake, uint256 slashableStake) { + (IStrategy[] memory strategies, uint256[] memory multipliers) = _getStrategiesAndMultipliers(operatorSet); + return _getStakes(operatorSet, strategies, multipliers, operator); + } + + /// @inheritdoc IStakeRootCompendium + function getDepositBalance( + OperatorSet memory operatorSet + ) external view returns (uint256 balance) { + DepositInfo memory depositInfo = depositInfos[operatorSet.avs][operatorSet.operatorSetId]; + (, uint96 cumulativeChargePerOperatorSet, uint96 cumulativeChargePerStrategy) = _calculateCumulativeCharges(); + uint256 pendingCharge = uint256( + cumulativeChargePerOperatorSet - depositInfo.cumulativeChargePerOperatorSetLastPaid + ) + + uint256(cumulativeChargePerStrategy - depositInfo.cumulativeChargePerStrategyLastPaid) + * operatorSetToStrategyAndMultipliers[operatorSet.avs][operatorSet.operatorSetId].length(); + + return depositInfo.balance > pendingCharge ? depositInfo.balance - pendingCharge : 0; + } + + /// @inheritdoc IStakeRootCompendium + function proofIntervalSeconds() external view returns (uint32) { + return cumulativeChargeParams.proofIntervalSeconds; + } + + // STAKE ROOT CALCULATION + + /// @inheritdoc IStakeRootCompendium + function getStakeRoot( + OperatorSet[] calldata operatorSetsInStakeTree, + bytes32[] calldata operatorSetRoots + ) external view returns (bytes32) { + require( + operatorSets.length == operatorSetsInStakeTree.length, + "StakeRootCompendium.getStakeRoot: operatorSets vs. operatorSetsInStakeTree length mismatch" + ); + require( + operatorSetsInStakeTree.length == operatorSetRoots.length, + "StakeRootCompendium.getStakeRoot: operatorSetsInStakeTree vs. operatorSetRoots mismatch" + ); + for (uint256 i = 0; i < operatorSetsInStakeTree.length; i++) { + require( + operatorSets[i].avs == operatorSetsInStakeTree[i].avs, + "StakeRootCompendium.getStakeRoot: operatorSets vs. operatorSetsInStakeTree avs mismatch" + ); + require( + operatorSets[i].operatorSetId == operatorSetsInStakeTree[i].operatorSetId, + "StakeRootCompendium.getStakeRoot: operatorSets vs. operatorSetsInStakeTree operatorSetId mismatch" + ); + } + return Merkle.merkleizeKeccak256(operatorSetRoots); + } + + /// @inheritdoc IStakeRootCompendium + function getOperatorSetLeaves( + uint256 operatorSetIndex, + uint256 startOperatorIndex, + uint256 numOperators + ) external view returns (OperatorLeaf[] memory) { + require( + operatorSetIndex < operatorSets.length, + "StakeRootCompendium.getOperatorSetLeaves: operator set index out of bounds" + ); + OperatorSet memory operatorSet = operatorSets[operatorSetIndex]; + address[] memory operators = avsDirectory.getOperatorsInOperatorSet(operatorSet, startOperatorIndex, numOperators); + (IStrategy[] memory strategies, uint256[] memory multipliers) = _getStrategiesAndMultipliers(operatorSet); + + OperatorLeaf[] memory operatorLeaves = new OperatorLeaf[](operators.length); + for (uint256 i = 0; i < operatorLeaves.length; i++) { + // calculate the weighted sum of the operator's shares for the strategies given the multipliers + (uint256 delegatedStake, uint256 slashableStake) = _getStakes(operatorSet, strategies, multipliers, operators[i]); + + operatorLeaves[i] = OperatorLeaf({ + delegatedStake: delegatedStake, + slashableStake: slashableStake, + extraData: operatorExtraDatas[operatorSet.avs][operatorSet.operatorSetId][operators[i]] + }); + } + return operatorLeaves; + } + + /// @inheritdoc IStakeRootCompendium + function getOperatorSetRoot( + uint32 operatorSetIndex, + OperatorLeaf[] calldata operatorLeaves + ) external view returns (bytes32) { + OperatorSet memory operatorSet = operatorSets[operatorSetIndex]; + require( + avsDirectory.isOperatorSet(operatorSet.avs, operatorSet.operatorSetId), + "StakeRootCompendium.getOperatorSetRoot: operator set does not exist" + ); + require( + operatorLeaves.length == avsDirectory.getNumOperatorsInOperatorSet(operatorSet), + "AVSSyncTree.getOperatorSetRoot: operator set size mismatch" + ); + + uint256 totalDelegatedStake; + uint256 totalSlashableStake; + bytes32 prevExtraData; + bytes32[] memory operatorLeavesHashes = new bytes32[](operatorLeaves.length); + for (uint256 i = 0; i < operatorLeaves.length; i++) { + require(uint256(prevExtraData) < uint256(operatorLeaves[i].extraData), "StakeRootCompendium.getOperatorSetRoot: extraData not sorted"); + prevExtraData = operatorLeaves[i].extraData; + + operatorLeavesHashes[i] = keccak256( + abi.encodePacked( + operatorLeaves[i].delegatedStake, + operatorLeaves[i].slashableStake, + operatorLeaves[i].extraData + ) + ); + + totalDelegatedStake += operatorLeaves[i].delegatedStake; + totalSlashableStake += operatorLeaves[i].slashableStake; + } + + bytes32 operatorTreeRoot = Merkle.merkleizeKeccak256(operatorLeavesHashes); + return keccak256( + abi.encodePacked( + operatorTreeRoot, + keccak256( + abi.encodePacked( + totalDelegatedStake, + totalSlashableStake, + operatorSetExtraDatas[operatorSet.avs][operatorSet.operatorSetId] + ) + ) + ) + ); + } + + function _safeTransferETH(address to, uint256 amount) internal { + (bool success,) = to.call{value: amount}(""); + require(success, EthTransferFailed()); + } + + // in case of charge problems + receive() external payable {} +} diff --git a/src/contracts/core/StakeRootCompendiumStorage.sol b/src/contracts/core/StakeRootCompendiumStorage.sol new file mode 100644 index 000000000..2c5bafea8 --- /dev/null +++ b/src/contracts/core/StakeRootCompendiumStorage.sol @@ -0,0 +1,95 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.27; + +import "@openzeppelin-upgrades/contracts/access/OwnableUpgradeable.sol"; +import "@openzeppelin/contracts/utils/structs/EnumerableMap.sol"; +import "../interfaces/IAVSDirectory.sol"; +import "../interfaces/IDelegationManager.sol"; +import "../interfaces/IAllocationManager.sol"; +import "../interfaces/IStakeRootCompendium.sol"; +import "../libraries/Snapshots.sol"; + +abstract contract StakeRootCompendiumStorage is IStakeRootCompendium, OwnableUpgradeable { + using Snapshots for Snapshots.History; + using EnumerableMap for EnumerableMap.AddressToUintMap; + using EnumerableSet for EnumerableSet.Bytes32Set; + + /// @notice the delegation manager contract + IDelegationManager public immutable delegationManager; + /// @notice the AVS directory contract + IAVSDirectory public immutable avsDirectory; + /// @notice the allocation manager contract + IAllocationManager public immutable allocationManager; + + /// @notice the minimum balance that must be maintained for an operatorSet + /// @dev this balance compensates gas costs to deregister an operatorSet + uint256 public immutable MIN_BALANCE_THRESHOLD; + + /// @notice the placeholder index used for operator sets that are removed from the StakeTree + uint32 public constant REMOVED_INDEX = type(uint32).max; + + /// @notice the minimum number of proofs that an operatorSet's deposit balance needs to cover and + /// the number of proofs they must pay for since their latest reconfiguration + /// @dev this prevents de-registering an operatorSet immediately after reconfiguring + uint256 public immutable MIN_PREPAID_PROOFS; + + /// @notice the verifier contract that will be used to verify snark proofs + address public immutable verifier; + + /// @notice the id of the program being verified when roots are posted + bytes32 public immutable imageId; + + /// @notice the total number of strategies among all operator sets (with duplicates) + uint256 public totalStrategies; + /// @notice the address allowed to confirm roots + address public rootConfirmer; + /// @notice list of operator sets that have been configured to be in the StakeTree + OperatorSet[] public operatorSets; + /// @notice the total charge for a proofs at a certain time depending on the number of strategies + Snapshots.History internal chargePerProof; + /// @dev Contains cumulative charges for operator sets, strategies, and max total charge. + ChargeParams public chargeParams; + /// @dev Contains info about cumulative charges. + CumulativeChargeParams public cumulativeChargeParams; + /// @notice deposit balance to be deducted for operatorSets + mapping(address => mapping(uint32 => DepositInfo)) public depositInfos; + /// @notice the extraData for each operatorSet + mapping(address => mapping(uint32 => bytes32)) public operatorSetExtraDatas; + /// @notice map from operator set to a trace of their index over time + mapping(address => mapping(uint32 => Snapshots.History)) internal operatorSetToIndex; + /// @notice the extraData for each operator in each operator set + mapping(address => mapping(uint32 => mapping(address => bytes32))) public operatorExtraDatas; + /// @notice the strategies and multipliers for each operator set + mapping(address => mapping(uint32 => EnumerableMap.AddressToUintMap)) internal operatorSetToStrategyAndMultipliers; + /// @notice the stake root submissions + IStakeRootCompendium.StakeRootSubmission[] public stakeRootSubmissions; + + constructor( + IDelegationManager _delegationManager, + IAVSDirectory _avsDirectory, + IAllocationManager _allocationManager, + uint256 _minBalanceThreshold, + uint256 _minPrepaidProofs, + address _verifier, + bytes32 _imageId + ) { + delegationManager = _delegationManager; + avsDirectory = _avsDirectory; + allocationManager = _allocationManager; + MIN_BALANCE_THRESHOLD = _minBalanceThreshold; + MIN_PREPAID_PROOFS = _minPrepaidProofs; + + // note verifier and imageId are immutable and set by implementation contract + // since proof verification is in the hot path, this is a gas optimization to avoid calling the storage contract for verifier and imageId + // however the new impl does not have access to the immutable variables of the last impl so we can't reference the old verifier and imageId + verifier = _verifier; + imageId = _imageId; + } + + /** + * @dev This empty reserved space is put in place to allow future versions to add new + * variables without shifting down storage in the inheritance chain. + * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps + */ + uint256[37] private __gap; +} diff --git a/src/contracts/core/StrategyManager.sol b/src/contracts/core/StrategyManager.sol index ddc36a032..a50cda0c6 100644 --- a/src/contracts/core/StrategyManager.sol +++ b/src/contracts/core/StrategyManager.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.12; +pragma solidity ^0.8.27; import "@openzeppelin-upgrades/contracts/proxy/utils/Initializable.sol"; import "@openzeppelin-upgrades/contracts/access/OwnableUpgradeable.sol"; @@ -35,22 +35,19 @@ contract StrategyManager is uint256 internal immutable ORIGINAL_CHAIN_ID; modifier onlyStrategyWhitelister() { - require( - msg.sender == strategyWhitelister, "StrategyManager.onlyStrategyWhitelister: not the strategyWhitelister" - ); + require(msg.sender == strategyWhitelister, OnlyStrategyWhitelister()); _; } - modifier onlyStrategiesWhitelistedForDeposit(IStrategy strategy) { - require( - strategyIsWhitelistedForDeposit[strategy], - "StrategyManager.onlyStrategiesWhitelistedForDeposit: strategy not whitelisted" - ); + modifier onlyStrategiesWhitelistedForDeposit( + IStrategy strategy + ) { + require(strategyIsWhitelistedForDeposit[strategy], StrategyNotWhitelisted()); _; } modifier onlyDelegationManager() { - require(msg.sender == address(delegation), "StrategyManager.onlyDelegationManager: not the DelegationManager"); + require(msg.sender == address(delegation), OnlyDelegationManager()); _; } @@ -62,8 +59,9 @@ contract StrategyManager is constructor( IDelegationManager _delegation, IEigenPodManager _eigenPodManager, - ISlasher _slasher - ) StrategyManagerStorage(_delegation, _eigenPodManager, _slasher) { + ISlasher _slasher, + IAVSDirectory _avsDirectory + ) StrategyManagerStorage(_delegation, _eigenPodManager, _slasher, _avsDirectory) { _disableInitializers(); ORIGINAL_CHAIN_ID = block.chainid; } @@ -125,7 +123,6 @@ contract StrategyManager is * @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 @@ -138,11 +135,7 @@ contract StrategyManager is uint256 expiry, bytes memory signature ) external onlyWhenNotPaused(PAUSED_DEPOSITS) nonReentrant returns (uint256 shares) { - require( - !thirdPartyTransfersForbidden[strategy], - "StrategyManager.depositIntoStrategyWithSignature: third transfers disabled" - ); - require(expiry >= block.timestamp, "StrategyManager.depositIntoStrategyWithSignature: signature expired"); + require(expiry >= block.timestamp, SignatureExpired()); // calculate struct hash, then increment `staker`'s nonce uint256 nonce = nonces[staker]; bytes32 structHash = keccak256(abi.encode(DEPOSIT_TYPEHASH, staker, strategy, token, amount, nonce, expiry)); @@ -181,6 +174,8 @@ contract StrategyManager is } /// @notice Used by the DelegationManager to convert withdrawn shares to tokens and send them to a recipient + /// Assumes that shares being passed in have already been accounted for any slashing + /// and are the `real` shares in the strategy to withdraw function withdrawSharesAsTokens( address recipient, IStrategy strategy, @@ -190,48 +185,29 @@ contract StrategyManager is strategy.withdraw(recipient, token, shares); } - /** - * 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 onlyStrategyWhitelister { - _setThirdPartyTransfersForbidden(strategy, value); - } - /** * @notice Owner-only function to change the `strategyWhitelister` address. * @param newStrategyWhitelister new address for the `strategyWhitelister`. */ - function setStrategyWhitelister(address newStrategyWhitelister) external onlyOwner { + function setStrategyWhitelister( + address newStrategyWhitelister + ) external onlyOwner { _setStrategyWhitelister(newStrategyWhitelister); } /** * @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 + IStrategy[] calldata strategiesToWhitelist ) external onlyStrategyWhitelister { - require( - strategiesToWhitelist.length == thirdPartyTransfersForbiddenValues.length, - "StrategyManager.addStrategiesToDepositWhitelist: array lengths do not match" - ); uint256 strategiesToWhitelistLength = strategiesToWhitelist.length; - for (uint256 i = 0; i < strategiesToWhitelistLength;) { + for (uint256 i = 0; i < strategiesToWhitelistLength; ++i) { // change storage and emit event only if strategy is not already in whitelist if (!strategyIsWhitelistedForDeposit[strategiesToWhitelist[i]]) { strategyIsWhitelistedForDeposit[strategiesToWhitelist[i]] = true; emit StrategyAddedToDepositWhitelist(strategiesToWhitelist[i]); - _setThirdPartyTransfersForbidden(strategiesToWhitelist[i], thirdPartyTransfersForbiddenValues[i]); - } - unchecked { - ++i; } } } @@ -240,21 +216,15 @@ contract StrategyManager is * @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 - { + function removeStrategiesFromDepositWhitelist( + IStrategy[] calldata strategiesToRemoveFromWhitelist + ) external onlyStrategyWhitelister { uint256 strategiesToRemoveFromWhitelistLength = strategiesToRemoveFromWhitelist.length; - for (uint256 i = 0; i < strategiesToRemoveFromWhitelistLength;) { + for (uint256 i = 0; i < strategiesToRemoveFromWhitelistLength; ++i) { // change storage and emit event only if strategy is already in whitelist if (strategyIsWhitelistedForDeposit[strategiesToRemoveFromWhitelist[i]]) { strategyIsWhitelistedForDeposit[strategiesToRemoveFromWhitelist[i]] = false; emit StrategyRemovedFromDepositWhitelist(strategiesToRemoveFromWhitelist[i]); - // Set mapping value to default false value - _setThirdPartyTransfersForbidden(strategiesToRemoveFromWhitelist[i], false); - } - unchecked { - ++i; } } } @@ -273,21 +243,27 @@ contract StrategyManager is */ function _addShares(address staker, IERC20 token, IStrategy strategy, uint256 shares) internal { // sanity checks on inputs - require(staker != address(0), "StrategyManager._addShares: staker cannot be zero address"); - require(shares != 0, "StrategyManager._addShares: shares should not be zero!"); + require(staker != address(0), StakerAddressZero()); + require(shares != 0, SharesAmountZero()); // if they dont have existing shares of this strategy, add it to their strats if (stakerStrategyShares[staker][strategy] == 0) { - require( - stakerStrategyList[staker].length < MAX_STAKER_STRATEGY_LIST_LENGTH, - "StrategyManager._addShares: deposit would exceed MAX_STAKER_STRATEGY_LIST_LENGTH" - ); + require(stakerStrategyList[staker].length < MAX_STAKER_STRATEGY_LIST_LENGTH, MaxStrategiesExceeded()); stakerStrategyList[staker].push(strategy); } // add the returned shares to their existing shares for this strategy + uint256 existingPrincipalShares = stakerStrategyShares[staker][strategy]; stakerStrategyShares[staker][strategy] += shares; + // Increase shares delegated to operator, if needed + delegation.increaseDelegatedShares({ + staker: staker, + strategy: strategy, + existingPrincipalShares: existingPrincipalShares, + addedShares: shares + }); + emit Deposit(staker, token, strategy, shares); } @@ -315,9 +291,6 @@ contract StrategyManager is // add the returned shares to the staker's existing shares for this strategy _addShares(staker, token, strategy, shares); - // Increase shares delegated to operator, if needed - delegation.increaseDelegatedShares(staker, strategy, shares); - return shares; } @@ -331,12 +304,12 @@ contract StrategyManager is */ function _removeShares(address staker, IStrategy strategy, uint256 shareAmount) internal returns (bool) { // sanity checks on inputs - require(shareAmount != 0, "StrategyManager._removeShares: shareAmount should not be zero!"); + require(shareAmount != 0, SharesAmountZero()); //check that the user has sufficient shares uint256 userShares = stakerStrategyShares[staker][strategy]; - require(shareAmount <= userShares, "StrategyManager._removeShares: shareAmount too high"); + require(shareAmount <= userShares, SharesAmountTooHigh()); //unchecked arithmetic since we just checked this above unchecked { userShares = userShares - shareAmount; @@ -365,63 +338,59 @@ contract StrategyManager is //loop through all of the strategies, find the right one, then replace uint256 stratsLength = stakerStrategyList[staker].length; uint256 j = 0; - for (; j < stratsLength;) { + for (; j < stratsLength; ++j) { if (stakerStrategyList[staker][j] == strategy) { //replace the strategy with the last strategy in the list stakerStrategyList[staker][j] = stakerStrategyList[staker][stakerStrategyList[staker].length - 1]; break; } - unchecked { - ++j; - } } // if we didn't find the strategy, revert - require(j != stratsLength, "StrategyManager._removeStrategyFromStakerStrategyList: strategy not found"); + require(j != stratsLength, StrategyNotFound()); // pop off the last entry in the list of strategies stakerStrategyList[staker].pop(); } - /** - * @notice Internal function for modifying `thirdPartyTransfersForbidden`. - * Used inside of the `setThirdPartyTransfersForbidden` and `addStrategiesToDepositWhitelist` functions. - * @param strategy The strategy to set `thirdPartyTransfersForbidden` value to - * @param value bool value to set `thirdPartyTransfersForbidden` to - */ - function _setThirdPartyTransfersForbidden(IStrategy strategy, bool value) internal { - emit UpdatedThirdPartyTransfersForbidden(strategy, value); - thirdPartyTransfersForbidden[strategy] = value; - } - /** * @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(address newStrategyWhitelister) internal { + function _setStrategyWhitelister( + address newStrategyWhitelister + ) internal { emit StrategyWhitelisterChanged(strategyWhitelister, newStrategyWhitelister); strategyWhitelister = newStrategyWhitelister; } // VIEW FUNCTIONS + /** * @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, uint256[] memory) { + function getDeposits( + address staker + ) external view returns (IStrategy[] memory, uint256[] memory) { uint256 strategiesLength = stakerStrategyList[staker].length; uint256[] memory shares = new uint256[](strategiesLength); - for (uint256 i = 0; i < strategiesLength;) { + for (uint256 i = 0; i < strategiesLength; ++i) { shares[i] = stakerStrategyShares[staker][stakerStrategyList[staker][i]]; - unchecked { - ++i; - } } return (stakerStrategyList[staker], shares); } + function getStakerStrategyList( + address staker + ) external view returns (IStrategy[] memory) { + return stakerStrategyList[staker]; + } + /// @notice Simple getter function that returns `stakerStrategyList[staker].length`. - function stakerStrategyListLength(address staker) external view returns (uint256) { + function stakerStrategyListLength( + address staker + ) external view returns (uint256) { return stakerStrategyList[staker].length; } diff --git a/src/contracts/core/StrategyManagerStorage.sol b/src/contracts/core/StrategyManagerStorage.sol index 085b1dc9a..1425f07a6 100644 --- a/src/contracts/core/StrategyManagerStorage.sol +++ b/src/contracts/core/StrategyManagerStorage.sol @@ -1,11 +1,12 @@ // SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.12; +pragma solidity ^0.8.27; import "../interfaces/IStrategyManager.sol"; import "../interfaces/IStrategy.sol"; import "../interfaces/IEigenPodManager.sol"; import "../interfaces/IDelegationManager.sol"; import "../interfaces/ISlasher.sol"; +import "../interfaces/IAVSDirectory.sol"; /** * @title Storage variables for the `StrategyManager` contract. @@ -27,6 +28,7 @@ abstract contract StrategyManagerStorage is IStrategyManager { IDelegationManager public immutable delegation; IEigenPodManager public immutable eigenPodManager; ISlasher public immutable slasher; + IAVSDirectory public immutable avsDirectory; /** * @notice Original EIP-712 Domain separator for this contract. @@ -70,12 +72,18 @@ abstract contract StrategyManagerStorage is IStrategyManager { * if true for a strategy, a user cannot depositIntoStrategyWithSignature into that strategy for another staker * and also when performing queueWithdrawals, a staker can only withdraw to themselves */ - mapping(IStrategy => bool) public thirdPartyTransfersForbidden; + mapping(IStrategy => bool) private __deprecated_thirdPartyTransfersForbidden; - constructor(IDelegationManager _delegation, IEigenPodManager _eigenPodManager, ISlasher _slasher) { + constructor( + IDelegationManager _delegation, + IEigenPodManager _eigenPodManager, + ISlasher _slasher, + IAVSDirectory _avsDirectory + ) { delegation = _delegation; eigenPodManager = _eigenPodManager; slasher = _slasher; + avsDirectory = _avsDirectory; } /** diff --git a/src/contracts/interfaces/IAVSDirectory.sol b/src/contracts/interfaces/IAVSDirectory.sol index b35cabc99..7a32e090c 100644 --- a/src/contracts/interfaces/IAVSDirectory.sol +++ b/src/contracts/interfaces/IAVSDirectory.sol @@ -3,8 +3,28 @@ pragma solidity >=0.5.0; import "./ISignatureUtils.sol"; +/// @notice Struct representing an operator set +struct OperatorSet { + address avs; + uint32 operatorSetId; +} + interface IAVSDirectory is ISignatureUtils { - /// @notice Enum representing the status of an operator's registration with an AVS + /// @dev Thrown when an invalid AVS is provided. + error InvalidAVS(); + /// @dev Thrown when an invalid operator is provided. + error InvalidOperator(); + /// @dev Thrown when an invalid operator set is provided. + error InvalidOperatorSet(); + /// @dev Thrown when `operator` is not a registered operator. + error OperatorNotRegistered(); + /// @dev Thrown when attempting to spend a spent eip-712 salt. + error SaltSpent(); + /// @dev Thrown when attempting to use an expired eip-712 signature. + error SignatureExpired(); + + /// @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. enum OperatorAVSRegistrationStatus { UNREGISTERED, // Operator not registered to AVS REGISTERED // Operator registered to AVS @@ -12,20 +32,138 @@ interface IAVSDirectory is ISignatureUtils { } /** - * @notice Emitted when @param avs 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 + * @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 */ - event AVSMetadataURIUpdated(address indexed avs, string metadataURI); + struct OperatorSetRegistrationStatus { + bool registered; + uint32 lastDeregisteredTimestamp; + } + + /// @notice Emitted when an operator set is created by an AVS. + event OperatorSetCreated(OperatorSet operatorSet); - /// @notice Emitted when an operator's registration status for an AVS is updated + /** + * @notice Emitted when an operator's registration status with an AVS id udpated + * @notice Only used by legacy M2 AVSs that have not integrated with operatorSets. + */ event OperatorAVSRegistrationStatusUpdated( address indexed operator, address indexed avs, OperatorAVSRegistrationStatus status ); + /// @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 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 AVS migrates to using operator sets. + event AVSMigratedToOperatorSets(address indexed avs); + + /// @notice Emitted when an operator is migrated from M2 registration to operator sets. + event OperatorMigratedToOperatorSets(address indexed operator, address indexed avs, uint32[] operatorSetIds); + + /** + * + * EXTERNAL FUNCTIONS + * + */ + + /** + * @notice Called by an AVS to create a list of new operatorSets. + * + * @param operatorSetIds The IDs of the operator set to initialize. + * + * @dev msg.sender must be the AVS. + * @dev The AVS may create operator sets before it becomes an operator set AVS. + */ + function createOperatorSets( + uint32[] calldata operatorSetIds + ) external; + + /** + * @notice Sets the AVS as an operator set AVS, preventing legacy M2 operator registrations. + * + * @dev msg.sender must be the AVS. + */ + function becomeOperatorSetAVS() external; + /** - * @notice Called by an avs to register an operator with the avs. - * @param operator The address of the operator to register. - * @param operatorSignature The signature, salt, and expiry of the operator's signature. + * @notice Called by an AVS to migrate operators that have a legacy M2 registration to operator sets. + * + * @param operators The list of operators to migrate + * @param operatorSetIds The list of operatorSets to migrate the operators to + * + * @dev The msg.sender used is the AVS + * @dev The operator can only be migrated at most once per AVS + * @dev The AVS can no longer register operators via the legacy M2 registration path once it begins migration + * @dev The operator is deregistered from the M2 legacy AVS once migrated + */ + function migrateOperatorsToOperatorSets( + address[] calldata operators, + uint32[][] calldata operatorSetIds + ) external; + + /** + * @notice Called by AVSs to add an operator to list of operatorSets. + * + * @param operator The address of the operator to be added to the operator set. + * @param operatorSetIds The IDs of the operator sets. + * @param operatorSignature The signature of the operator on their intent to register. + * + * @dev msg.sender is used as the AVS. + * @dev The operator must not have a pending deregistration from the operator set. + */ + function registerOperatorToOperatorSets( + address operator, + uint32[] calldata operatorSetIds, + ISignatureUtils.SignatureWithSaltAndExpiry memory operatorSignature + ) external; + + /** + * @notice Called by AVSs to remove an operator from an operator set. + * + * @param operator The address of the operator to be removed from the operator set. + * @param operatorSetIds The IDs of the operator sets. + * + * @dev msg.sender is used as the AVS. + */ + function deregisterOperatorFromOperatorSets(address operator, uint32[] calldata operatorSetIds) external; + + /** + * @notice Called by an operator to deregister from an operator set + * + * @param operator The operator to deregister from the operatorSets. + * @param avs The address of the AVS to deregister the operator from. + * @param operatorSetIds The IDs of the operator sets. + * @param operatorSignature the signature of the operator on their intent to deregister or empty if the operator itself is calling + * + * @dev if the operatorSignature is empty, the caller must be the operator + * @dev this will likely only be called in case the AVS contracts are in a state that prevents operators from deregistering + */ + function forceDeregisterFromOperatorSets( + address operator, + address avs, + uint32[] calldata operatorSetIds, + ISignatureUtils.SignatureWithSaltAndExpiry memory operatorSignature + ) external; + + /** + * @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 `registerOperatorToOperatorSets` 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( address operator, @@ -33,30 +171,114 @@ interface IAVSDirectory is ISignatureUtils { ) external; /** - * @notice Called by an avs to deregister an operator with the avs. - * @param operator The address of the operator to deregister. + * @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(address operator) external; + function deregisterOperatorFromAVS( + address operator + ) 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 + * @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(string calldata metadataURI) external; + function updateAVSMetadataURI( + string calldata metadataURI + ) external; /** - * @notice Returns whether or not the salt has already been used by the operator. - * @dev Salts is used in the `registerOperatorToAVS` function. + * @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( + bytes32 salt + ) external; + + /** + * + * VIEW FUNCTIONS + * */ function operatorSaltIsSpent(address operator, bytes32 salt) external view returns (bool); + function isMember(address operator, OperatorSet memory operatorSet) external view returns (bool); + + function isOperatorSetAVS( + address avs + ) external view returns (bool); + + function isOperatorSet(address avs, uint32 operatorSetId) 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 to - * @param salt A unique and single use value associated with the approver signature. - * @param expiry Time after which the approver's signature becomes invalid + * @notice Returns operator set an operator is registered to in the order they were registered. + * @param operator The operator address to query. + * @param index The index of the enumerated list of operator sets. + */ + function operatorSetsMemberOfAtIndex(address operator, uint256 index) external view returns (OperatorSet memory); + + /** + * @notice Retursn the operator registered to an operatorSet in the order that it was registered. + * @param operatorSet The operatorSet to query. + * @param index The index of the enumerated list of operators. + */ + function operatorSetMemberAtIndex(OperatorSet memory operatorSet, uint256 index) external view returns (address); + + /** + * @notice Returns an array of operator sets an operator is registered to. + * @param operator The operator address to query. + * @param start The starting index of the array to query. + * @param length The amount of items of the array to return. + */ + function getOperatorSetsOfOperator( + address operator, + uint256 start, + uint256 length + ) external view returns (OperatorSet[] memory operatorSets); + + /** + * @notice Returns an array of operators registered to the operatorSet. + * @param operatorSet The operatorSet to query. + * @param start The starting index of the array to query. + * @param length The amount of items of the array to return. + */ + function getOperatorsInOperatorSet( + OperatorSet memory operatorSet, + uint256 start, + uint256 length + ) external view returns (address[] memory operators); + + /** + * @notice Returns the number of operators registered to an operatorSet. + * @param operatorSet The operatorSet to get the member count for + */ + function getNumOperatorsInOperatorSet( + OperatorSet memory operatorSet + ) external view returns (uint256); + + /** + * @notice Returns the total number of operator sets an operator is registered to. + * @param operator The operator address to query. + */ + function inTotalOperatorSets( + address operator + ) external view returns (uint256); + + /** + * @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( address operator, @@ -65,6 +287,49 @@ interface IAVSDirectory is ISignatureUtils { uint256 expiry ) external view returns (bytes32); - /// @notice The EIP-712 typehash for the Registration struct used by the contract + /** + * @notice Calculates the digest hash to be signed by an operator to register with an operator set. + * + * @param avs The AVS that operator is registering to operator sets for. + * @param operatorSetIds An array of operator set IDs the operator is registering to. + * @param salt A unique and single use value associated with the approver signature. + * @param expiry Time after which the approver's signature becomes invalid. + */ + function calculateOperatorSetRegistrationDigestHash( + address avs, + uint32[] calldata operatorSetIds, + bytes32 salt, + uint256 expiry + ) external view returns (bytes32); + + /** + * @notice Calculates the digest hash to be signed by an operator to force deregister from an operator set. + * + * @param avs The AVS that operator is deregistering from. + * @param operatorSetIds An array of operator set IDs the operator is deregistering from. + * @param salt A unique and single use value associated with the approver signature. + * @param expiry Time after which the approver's signature becomes invalid. + */ + function calculateOperatorSetForceDeregistrationTypehash( + address avs, + uint32[] calldata operatorSetIds, + bytes32 salt, + uint256 expiry + ) 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. + function domainSeparator() external view returns (bytes32); + + /// @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); + + function operatorSetStatus( + address avs, + address operator, + uint32 operatorSetId + ) external view returns (bool registered, uint32 lastDeregisteredTimestamp); } diff --git a/src/contracts/interfaces/IAllocationManager.sol b/src/contracts/interfaces/IAllocationManager.sol new file mode 100644 index 000000000..9cb2a905b --- /dev/null +++ b/src/contracts/interfaces/IAllocationManager.sol @@ -0,0 +1,331 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity >=0.5.0; + +import {OperatorSet} from "./IAVSDirectory.sol"; +import "./IStrategy.sol"; +import "./ISignatureUtils.sol"; + +interface IAllocationManager is ISignatureUtils { + /// @dev Thrown when `operator` is not a registered operator. + error OperatorNotRegistered(); + /// @dev Thrown when two array parameters have mismatching lengths. + error InputArrayLengthMismatch(); + /// @dev Thrown when an operator attempts to set their allocation delay to 0 + error InvalidDelay(); + /// @dev Thrown when an operator's allocation delay has yet to be set. + error UninitializedAllocationDelay(); + /// @dev Thrown when provided `expectedTotalMagnitude` for a given allocation does not match `currentTotalMagnitude`. + error InvalidExpectedTotalMagnitude(); + /// @dev Thrown when an invalid operator set is provided. + error InvalidOperatorSet(); + /// @dev Thrown when an invalid operator is provided. + error InvalidOperator(); + /// @dev Thrown when caller is not the delegation manager. + error OnlyDelegationManager(); + /// @dev Thrown when an operator attempts to set their allocation for an operatorSet to the same value + error SameMagnitude(); + /// @dev Thrown when an allocation is attempted for a given operator when they have pending allocations or deallocations. + error PendingAllocationOrDeallocation(); + /// @dev Thrown when an allocation is attempted that exceeds a given operators total allocatable magnitude. + error InsufficientAllocatableMagnitude(); + /// @dev Thrown when attempting to use an expired eip-712 signature. + error SignatureExpired(); + /// @dev Thrown when attempting to spend a spent eip-712 salt. + error SaltSpent(); + + /** + * @notice struct used to modify the allocation of slashable magnitude to list of operatorSets + * @param strategy the strategy to allocate magnitude for + * @param expectedTotalMagnitude the expected total magnitude of the operator used to combat against race conditions with slashing + * @param operatorSets the operatorSets to allocate magnitude for + * @param magnitudes the magnitudes to allocate for each operatorSet + */ + struct MagnitudeAllocation { + IStrategy strategy; + uint64 expectedTotalMagnitude; + OperatorSet[] operatorSets; + uint64[] magnitudes; + } + + /** + * @notice struct used for pending free magnitude. Stored in (operator, strategy, operatorSet) mapping + * to be used in completeDeallocations. + * @param magnitudeDiff the amount of magnitude to deallocate + * @param completableTimestamp the timestamp at which the deallocation can be completed, 21 days from when queued + */ + struct PendingFreeMagnitude { + uint64 magnitudeDiff; + uint32 completableTimestamp; + } + + /** + * @notice Struct containing info regarding free allocatable magnitude. + * @param nextPendingFreeMagnitudeIndex The next available update index. + * @param freeMagnitude The total amount of free allocatable magnitude. + */ + struct OperatorMagnitudeInfo { + uint192 nextPendingFreeMagnitudeIndex; + uint64 freeMagnitude; + } + + /** + * @notice Struct containing allocation delay metadata for a given operator. + * @param delay Current allocation delay if `pendingDelay` is non-zero and `pendingDelayEffectTimestamp` has elapsed. + * @param pendingDelay Current allocation delay if it's non-zero and `pendingDelayEffectTimestamp` has elapsed. + * @param pendingDelayEffectTimestamp The timestamp for which `pendingDelay` becomes the curren allocation delay. + */ + struct AllocationDelayInfo { + uint32 delay; + uint32 pendingDelay; + uint32 pendingDelayEffectTimestamp; + } + + /// @notice Emitted when operator updates their allocation delay. + event AllocationDelaySet(address operator, uint32 delay); + + /// @notice Emitted when an operator set is created by an AVS. + event OperatorSetCreated(OperatorSet operatorSet); + + /// @notice Emitted when an operator allocates slashable magnitude to an operator set + event MagnitudeAllocated( + address operator, + IStrategy strategy, + OperatorSet operatorSet, + uint64 magnitudeToAllocate, + uint32 effectTimestamp + ); + + /// @notice Emitted when an operator queues deallocations of slashable magnitude from an operator set + event MagnitudeQueueDeallocated( + address operator, + IStrategy strategy, + OperatorSet operatorSet, + uint64 magnitudeToDeallocate, + uint32 completableTimestamp + ); + + /// @notice Emitted when an operator completes deallocations of slashable magnitude from an operator set + /// and adds back magnitude to free allocatable magnitude + event MagnitudeDeallocationCompleted( + address operator, IStrategy strategy, OperatorSet operatorSet, uint64 freeMagnitudeAdded + ); + + /// @notice Emitted when an operator is slashed by an operator set for a strategy + event OperatorSlashed(address operator, uint32 operatorSetId, IStrategy strategy, uint16 bipsToSlash); + + /** + * + * EXTERNAL FUNCTIONS + * + */ + + /** + * @notice Called by the delagation manager to set delay when operators register. + * @param operator The operator to set the delay on behalf of. + * @param delay The allocation delay in seconds. + * @dev msg.sender is assumed to be the delegation manager. + */ + function setAllocationDelay(address operator, uint32 delay) external; + + /** + * @notice Called by operators to set their allocation delay. + * @param delay the allocation delay in seconds + * @dev msg.sender is assumed to be the operator + */ + function setAllocationDelay( + uint32 delay + ) external; + + /** + * @notice Modifies the propotions of slashable stake allocated to a list of operatorSets for a set of strategies + * @param operator address to modify allocations for + * @param allocations array of magnitude adjustments for multiple strategies and corresponding operator sets + * @param operatorSignature signature of the operator if msg.sender is not the operator + * @dev updates freeMagnitude for the updated strategies + * @dev must be called by the operator + */ + function modifyAllocations( + address operator, + MagnitudeAllocation[] calldata allocations, + SignatureWithSaltAndExpiry calldata operatorSignature + ) external; + + /** + * @notice For all pending deallocations that have become completable, their pending free magnitude can be + * added back to the free magnitude of the (operator, strategy) amount. This function takes a list of strategies + * and adds all completable deallocations for each strategy, updating the freeMagnitudes of the operator + * + * @param operator address to complete deallocations for + * @param strategies a list of strategies to complete deallocations for + * + * @dev can be called permissionlessly by anyone + */ + function updateFreeMagnitude( + address operator, + IStrategy[] calldata strategies, + uint16[] calldata numToComplete + ) external; + + /** + * @notice Called by an AVS to slash an operator for given operatorSetId, list of strategies, and bipsToSlash. + * For each given (operator, operatorSetId, strategy) tuple, bipsToSlash + * bips of the operatorSet's slashable stake allocation will be slashed + * + * @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 bipsToSlash the number of bips to slash, this will be proportional to the + * operator's slashable stake allocation for the operatorSet + */ + function slashOperator( + address operator, + uint32 operatorSetId, + IStrategy[] calldata strategies, + uint16 bipsToSlash + ) external; + + /** + * @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( + bytes32 salt + ) external; + + /** + * + * VIEW FUNCTIONS + * + */ + + /** + * @notice Returns the allocation delay of an operator + * @param operator The operator to get the allocation delay for + * @dev Defaults to `DEFAULT_ALLOCATION_DELAY` if none is set + */ + function allocationDelay( + address operator + ) external view returns (bool isSet, uint32 delay); + + /** + * @notice Get the allocatable magnitude for an operator and strategy based on number of pending deallocations + * that could be completed at the same time. This is the sum of freeMagnitude and the sum of all pending completable deallocations. + * @param operator the operator to get the allocatable magnitude for + * @param strategy the strategy to get the allocatable magnitude for + */ + function getAllocatableMagnitude(address operator, IStrategy strategy) external view returns (uint64); + + /** + * @notice Returns the pending allocations of an operator for a given strategy and operatorSets + * One of the assumptions here is we don't allow more than one pending allocation for an operatorSet at a time. + * If that changes, we would need to change this function to return all pending allocations for an operatorSet. + * @param operator the operator to get the pending allocations for + * @param strategy the strategy to get the pending allocations for + * @param operatorSets the operatorSets to get the pending allocations for + * @return pendingMagnitude the pending allocations for each operatorSet + * @return timestamps the timestamps for each pending allocation + */ + function getPendingAllocations( + address operator, + IStrategy strategy, + OperatorSet[] calldata operatorSets + ) external view returns (uint64[] memory, uint32[] memory); + + /** + * @notice Returns the pending deallocations of an operator for a given strategy and operatorSets. + * One of the assumptions here is we don't allow more than one pending deallocation for an operatorSet at a time. + * If that changes, we would need to change this function to return all pending deallocations for an operatorSet. + * @param operator the operator to get the pending deallocations for + * @param strategy the strategy to get the pending deallocations for + * @param operatorSets the operatorSets to get the pending deallocations for + * @return pendingMagnitudes the latest pending deallocation + */ + function getPendingDeallocations( + address operator, + IStrategy strategy, + OperatorSet[] calldata operatorSets + ) external view returns (PendingFreeMagnitude[] memory); + + /** + * @notice operator is slashable by operatorSet if currently registered OR last deregistered within 21 days + * @param operator the operator to check slashability for + * @param operatorSet the operatorSet to check slashability for + * @return bool if the operator is slashable by the operatorSet + */ + function isOperatorSlashable(address operator, OperatorSet memory operatorSet) external view returns (bool); + + /** + * @param operator the operator to get the slashable magnitude for + * @param strategies the strategies to get the slashable magnitude for + * + * @return operatorSets the operator sets the operator is a member of and the current slashable magnitudes for each strategy + */ + function getSlashableMagnitudes( + address operator, + IStrategy[] calldata strategies + ) external view returns (OperatorSet[] memory, uint64[][] memory); + + /** + * @notice Returns the current total magnitudes of an operator for a given set of strategies + * @param operator the operator to get the total magnitude for + * @param strategies the strategies to get the total magnitudes for + * @return totalMagnitudes the total magnitudes for each strategy + */ + function getTotalMagnitudes( + address operator, + IStrategy[] calldata strategies + ) external view returns (uint64[] memory); + + /** + * @notice Returns the total magnitudes of an operator for a given set of strategies at a given timestamp + * @param operator the operator to get the total magnitude for + * @param strategies the strategies to get the total magnitudes for + * @param timestamp the timestamp to get the total magnitudes at + * @return totalMagnitudes the total magnitudes for each strategy + */ + function getTotalMagnitudesAtTimestamp( + address operator, + IStrategy[] calldata strategies, + uint32 timestamp + ) external view returns (uint64[] memory); + + /** + * @param operator the operator to get the total and allocated magnitudes for + * @param operatorSet the operatorSet to get the total and allocated magnitudes for + * @param strategies the strategies to get the total and allocated magnitudes for + * + * @return the list of total magnitudes for each strategy and the list of allocated magnitudes for each strategy + */ + function getTotalAndAllocatedMagnitudes( + address operator, + OperatorSet calldata operatorSet, + IStrategy[] calldata strategies + ) external view returns (uint64[] memory, uint64[] memory); + + /** + * @notice Returns the current total magnitude of an operator for a given strategy + * @param operator the operator to get the total magnitude for + * @param strategy the strategy to get the total magnitude for + * @return totalMagnitude the total magnitude for the strategy + */ + function getTotalMagnitude(address operator, IStrategy strategy) external view returns (uint64); + + /** + * @notice Calculates the digest hash to be signed by an operator to modify magnitude allocations + * @param operator The operator to allocate or deallocate magnitude for. + * @param allocations The magnitude allocations/deallocations to be made. + * @param salt A unique and single use value associated with the approver signature. + * @param expiry Time after which the approver's signature becomes invalid. + */ + function calculateMagnitudeAllocationDigestHash( + address operator, + MagnitudeAllocation[] calldata allocations, + bytes32 salt, + uint256 expiry + ) 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. + function domainSeparator() external view returns (bytes32); +} diff --git a/src/contracts/interfaces/IDelegationFaucet.sol b/src/contracts/interfaces/IDelegationFaucet.sol index 8741208db..5642c1342 100644 --- a/src/contracts/interfaces/IDelegationFaucet.sol +++ b/src/contracts/interfaces/IDelegationFaucet.sol @@ -13,7 +13,9 @@ interface IDelegationFaucet { uint256 _depositAmount ) external; - function getStaker(address operator) external returns (address); + function getStaker( + address operator + ) external returns (address); function depositIntoStrategy( address staker, diff --git a/src/contracts/interfaces/IDelegationManager.sol b/src/contracts/interfaces/IDelegationManager.sol index dc42416b6..2114769c1 100644 --- a/src/contracts/interfaces/IDelegationManager.sol +++ b/src/contracts/interfaces/IDelegationManager.sol @@ -3,6 +3,7 @@ pragma solidity >=0.5.0; import "./IStrategy.sol"; import "./ISignatureUtils.sol"; +import "../libraries/SlashingLib.sol"; /** * @title DelegationManager @@ -15,6 +16,45 @@ import "./ISignatureUtils.sol"; * - enabling a staker to undelegate its assets from the operator it is delegated to (performed as part of the withdrawal process, initiated through the StrategyManager) */ interface IDelegationManager is ISignatureUtils { + /// @dev Thrown when an account is actively delegated. + error ActivelyDelegated(); + /// @dev Thrown when attempting to execute an action that was not queued. + error WithdrawalNotQueued(); + /// @dev Thrown when provided delay exceeds maximum. + error AllocationDelaySet(); + /// @dev Thrown when caller cannot undelegate on behalf of a staker. + error CallerCannotUndelegate(); + /// @dev Thrown when two array parameters have mismatching lengths. + error InputArrayLengthMismatch(); + /// @dev Thrown when input arrays length is zero. + error InputArrayLengthZero(); + /// @dev Thrown when `operator` is not a registered operator. + error OperatorNotRegistered(); + /// @dev Thrown when caller is neither the StrategyManager or EigenPodManager contract. + error OnlyStrategyManagerOrEigenPodManager(); + /// @dev Thrown when an operator attempts to undelegate. + error OperatorsCannotUndelegate(); + /// @dev Thrown when an account is not actively delegated. + error NotActivelyDelegated(); + /// @dev Thrown when attempting to spend a spent eip-712 salt. + error SaltSpent(); + /// @dev Thrown when attempting to use an expired eip-712 signature. + error SignatureExpired(); + /// @dev Thrown when provided `stakerOptOutWindowBlocks` cannot decrease. + error StakerOptOutWindowBlocksCannotDecrease(); + /// @dev Thrown when provided `stakerOptOutWindowBlocks` exceeds maximum. + error StakerOptOutWindowBlocksExceedsMax(); + /// @dev Thrown when attempting to withdraw before delay has elapsed. + error WithdrawalDelayNotElapsed(); + /// @dev Thrown when provided delay exceeds maximum. + error WithdrawalDelayExeedsMax(); + /// @dev Thrown when a withdraw amount larger than max is attempted. + error WithdrawalExeedsMax(); + /// @dev Thrown when withdrawer is not the current caller. + error WithdrawerNotCaller(); + /// @dev Thrown when `withdrawer` is not staker. + error WithdrawerNotStaker(); + // @notice Struct used for storing information about a single operator who has registered with EigenLayer struct OperatorDetails { /// @notice DEPRECATED -- this field is no longer used, payments are handled in PaymentCoordinator.sol @@ -82,18 +122,23 @@ interface IDelegationManager is ISignatureUtils { address withdrawer; // Nonce used to guarantee that otherwise identical withdrawals have unique hashes uint256 nonce; - // Block number when the Withdrawal was created - uint32 startBlock; + // Timestamp when the Withdrawal was created. + // NOTE this used to be `startBlock` but changedto timestamps in the Slashing release. This has no effect + // on the hash of this struct but we do need to know when to handle blocknumbers vs timestamps depending on + // if the withdrawal was created before or after the Slashing release. + uint32 startTimestamp; // Array of strategies that the Withdrawal contains IStrategy[] strategies; - // Array containing the amount of shares in each Strategy in the `strategies` array - uint256[] shares; + // Array containing the amount of staker's delegatedShares for withdrawal in each Strategy in the `strategies` array + // Note that these shares need to be multiplied by the operator's totalMagnitude at completion to include + // slashing occurring during the queue withdrawal delay + DelegatedShares[] delegatedShares; } struct QueuedWithdrawalParams { // Array of strategies that the QueuedWithdrawal contains IStrategy[] strategies; - // Array containing the amount of shares in each Strategy in the `strategies` array + // Array containing the amount of shares for withdrawal in each Strategy in the `strategies` array uint256[] shares; // The address of the withdrawer address withdrawer; @@ -136,15 +181,10 @@ interface IDelegationManager is ISignatureUtils { /// @notice Emitted when a queued withdrawal is completed event WithdrawalCompleted(bytes32 withdrawalRoot); - /// @notice Emitted when the `minWithdrawalDelayBlocks` variable is modified from `previousValue` to `newValue`. - event MinWithdrawalDelayBlocksSet(uint256 previousValue, uint256 newValue); - - /// @notice Emitted when the `strategyWithdrawalDelayBlocks` variable is modified from `previousValue` to `newValue`. - event StrategyWithdrawalDelayBlocksSet(IStrategy strategy, uint256 previousValue, uint256 newValue); - /** * @notice Registers the caller as an operator in EigenLayer. * @param registeringOperatorDetails is the `OperatorDetails` for the 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". @@ -152,6 +192,7 @@ interface IDelegationManager is ISignatureUtils { */ function registerAsOperator( OperatorDetails calldata registeringOperatorDetails, + uint32 allocationDelay, string calldata metadataURI ) external; @@ -161,14 +202,18 @@ interface IDelegationManager is ISignatureUtils { * * @dev The caller must have previously registered as an operator in EigenLayer. */ - function modifyOperatorDetails(OperatorDetails calldata newOperatorDetails) external; + 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; + function updateOperatorMetadataURI( + string calldata metadataURI + ) external; /** * @notice Caller delegates their stake to an operator. @@ -224,7 +269,9 @@ interface IDelegationManager is ISignatureUtils { * @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); + function undelegate( + address staker + ) external returns (bytes32[] memory withdrawalRoot); /** * Allows a staker to withdraw some shares. Withdrawn shares/strategies are immediately removed @@ -233,20 +280,17 @@ interface IDelegationManager is ISignatureUtils { * * 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); + 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 should be calculated off chain before calling this function by finding the first index that satisfies `slasher.canWithdraw` * @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. @@ -254,7 +298,6 @@ interface IDelegationManager is ISignatureUtils { function completeQueuedWithdrawal( Withdrawal calldata withdrawal, IERC20[] calldata tokens, - uint256 middlewareTimesIndex, bool receiveAsTokens ) external; @@ -263,97 +306,116 @@ interface IDelegationManager is ISignatureUtils { * 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( Withdrawal[] calldata withdrawals, IERC20[][] calldata tokens, - uint256[] calldata middlewareTimesIndexes, bool[] calldata receiveAsTokens ) external; /** - * @notice Increases a staker's delegated share balance in a strategy. + * @notice Increases a staker's delegated share balance in a strategy. Note that before adding to operator shares, + * the delegated shares are scaled according to the operator's total magnitude as part of slashing accounting. + * The staker's depositScalingFactor is updated here. * @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. + * @param existingPrincipalShares The number of deposit shares the staker already has in the strategy. This is the shares amount stored in the + * StrategyManager/EigenPodManager for the staker's shares. + * @param addedShares The number of shares to added to the staker's shares in the strategy. This amount will be scaled prior to adding + * to the operator's scaled shares. * - * @dev *If the staker is actively delegated*, then increases the `staker`'s delegated shares in `strategy` by `shares`. Otherwise does nothing. + * @dev *If the staker is actively delegated*, then increases the `staker`'s delegated scaled shares in `strategy`. + * Otherwise does nothing. * @dev Callable only by the StrategyManager or EigenPodManager. */ - function increaseDelegatedShares(address staker, IStrategy strategy, uint256 shares) external; + function increaseDelegatedShares( + address staker, + IStrategy strategy, + uint256 existingPrincipalShares, + uint256 addedShares + ) 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. + * @notice Decreases a staker's delegated share balance in a strategy. Note that before removing from operator shares, + * the delegated shares are scaled according to the operator's total magnitude as part of slashing accounting. Unlike + * `increaseDelegatedShares`, the staker's depositScalingFactor is not updated here. + * @param staker The address to increase the delegated scaled shares for their operator. + * @param strategy The strategy in which to decrease the delegated scaled shares. + * @param removedShares The number of shares to decremented for the strategy in the + * StrategyManager/EigenPodManager * - * @dev *If the staker is actively delegated*, then decreases the `staker`'s delegated shares in `strategy` by `shares`. Otherwise does nothing. + * @dev *If the staker is actively delegated*, then decreases the `staker`'s delegated scaled shares in `strategy` by `scaledShares`. Otherwise does nothing. * @dev Callable only by the StrategyManager or EigenPodManager. */ - function decreaseDelegatedShares(address staker, IStrategy strategy, uint256 shares) external; + function decreaseDelegatedShares(address staker, IStrategy strategy, uint256 removedShares) 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); + 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); + 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); + function delegationApprover( + address operator + ) external view returns (address); /** * @notice Returns the stakerOptOutWindowBlocks for an operator */ - function stakerOptOutWindowBlocks(address operator) external view returns (uint256); + function stakerOptOutWindowBlocks( + address operator + ) external view returns (uint256); /** - * @notice Given array of strategies, returns array of shares for the operator + * @notice returns the total number of delegatedShares (i.e. shares divided by the `operator`'s + * totalMagnitude) in `strategy` that are delegated to `operator`. + * @notice Mapping: operator => strategy => total number of delegatedShares in the strategy delegated to the operator. + * @dev By design, the following invariant should hold for each Strategy: + * (operator's delegatedShares in delegation manager) = sum (delegatedShares above zero of all stakers delegated to operator) + * = sum (delegateable delegatedShares of all stakers delegated to the operator) + * @dev FKA `operatorShares` */ - function getOperatorShares( + function operatorDelegatedShares(address operator, IStrategy strategy) external view returns (uint256); + + /// @notice Given array of strategies, returns array of delegated shares for the operator + function getOperatorDelegatedShares( address operator, IStrategy[] memory strategies ) external view returns (uint256[] 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 (uint256); - - /** - * @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 (uint256); - /** * @notice Returns 'true' if `staker` *is* actively delegated, and 'false' otherwise. */ - function isDelegated(address staker) external view returns (bool); + 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); + 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 (uint256); + function stakerNonce( + address staker + ) external view returns (uint256); /** * @notice Mapping: delegationApprover => 32-byte salt => whether or not the salt has already been used by the delegationApprover. @@ -362,20 +424,6 @@ interface IDelegationManager is ISignatureUtils { */ 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 (uint256); - - /** - * @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 (uint256); - /// @notice return address of the beaconChainETHStrategy function beaconChainETHStrategy() external view returns (IStrategy); @@ -441,8 +489,12 @@ interface IDelegationManager is ISignatureUtils { /// @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 (uint256); + function cumulativeWithdrawalsQueued( + address staker + ) external view returns (uint256); /// @notice Returns the keccak256 hash of `withdrawal`. - function calculateWithdrawalRoot(Withdrawal memory withdrawal) external pure returns (bytes32); + function calculateWithdrawalRoot( + Withdrawal memory withdrawal + ) external pure returns (bytes32); } diff --git a/src/contracts/interfaces/IEigen.sol b/src/contracts/interfaces/IEigen.sol index cd9279e55..0de79374b 100644 --- a/src/contracts/interfaces/IEigen.sol +++ b/src/contracts/interfaces/IEigen.sol @@ -31,12 +31,16 @@ interface IEigen is IERC20 { /** * @notice This function allows bEIGEN holders to wrap their tokens into Eigen */ - function wrap(uint256 amount) external; + function wrap( + uint256 amount + ) external; /** * @notice This function allows Eigen holders to unwrap their tokens into bEIGEN */ - function unwrap(uint256 amount) external; + function unwrap( + uint256 amount + ) external; /** * @dev Clock used for flagging checkpoints. Has been overridden to implement timestamp based diff --git a/src/contracts/interfaces/IEigenPod.sol b/src/contracts/interfaces/IEigenPod.sol index be96da52c..0edb74f9c 100644 --- a/src/contracts/interfaces/IEigenPod.sol +++ b/src/contracts/interfaces/IEigenPod.sol @@ -13,6 +13,55 @@ import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; * to account balances in terms of gwei in the EigenPod contract and convert to wei when making calls to other contracts */ interface IEigenPod { + /// @dev Thrown when amount exceeds `withdrawableRestakedExecutionLayerGwei`. + error AmountExceedsWithdrawableRestakedExecutionLayerGwei(); + /// @dev Thrown when provided `amountGwei` is not a multiple of gwei. + error AmountMustBeMultipleOfGwei(); + /// @dev Thrown when provided `beaconTimestamp` is too far in the past. + error BeaconTimestampTooFarInPast(); + /// @dev Thrown when attempting to create a checkpoint twice within a given block. + error CannotCheckpointTwiceInSingleBlock(); + /// @dev Thrown when attempting an action that is currently paused. + error CurrentlyPaused(); + /// @dev Thrown if a validator is exiting. + error ValidatorIsExiting(); + /// @dev Thrown when no active checkpoints are found. + error NoActiveCheckpoints(); + /// @dev Thrown if there's not a balance available to checkpoint. + error NoBalanceToCheckpoint(); + /// @dev Thrown when an address of zero is provided. + error InputAddressZero(); + /// @dev Thrown when two array parameters have mismatching lengths. + error InputArrayLengthMismatch(); + /// @dev Thrown when an invalid block root is returned. + error InvalidBlockRoot(); + /// @dev Thrown when `validatorPubKey` length is not equal to 48-bytes. + error InvalidValidatorPubKeyLength(); + /// @dev Thrown when a proof is older than the last checkpoint. + error ProofOlderThanLastCheckpoint(); + /// @dev Thrown when a validator is not inactive. + error ValidatorAlreadyActive(); + /// @dev Thrown when a validator is not active. + error ValidatorNotActive(); + /// @dev Thrown when a validator is not stale. + error ValidatorNotSlashed(); + /// @dev Thrown when validator is not in the process of becoming active. + error ValidatorNoPendingActivation(); + /// @dev Thrown if a previous uncomplete checkpoint exists. + error IncompletePreviousCheckpoint(); + /// @dev Thrown when msg.value is not equal to 32 eth. + error MsgValueNot32ETH(); + /// @dev Thrown when provided timestamp is out of range. + error TimestampOutOfRange(); + /// @dev Thrown when only the EigenPodManager can perform the action. + error OnlyEigenPodManager(); + /// @dev Thrown when only the EigenPodOwner can perform the action. + error OnlyEigenPodOwner(); + /// @dev Thrown when either the EigenPodOwner or a proof submitter can perform the action. + error OnlyEigenPodOwnerOrProofSubmitter(); + /// @dev Thrown if the provided proof is not valid for this EigenPod. + error WithdrawCredentialsNotForEigenPod(); + /** * * STRUCTS / ENUMS @@ -89,7 +138,9 @@ interface IEigenPod { */ /// @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; + 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; @@ -115,7 +166,9 @@ interface IEigenPod { * @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; + function startCheckpoint( + bool revertIfNoBalance + ) external; /** * @dev Progress the current checkpoint towards completion by submitting one or more validator @@ -200,7 +253,9 @@ interface IEigenPod { /// 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; + function setProofSubmitter( + address newProofSubmitter + ) external; /** * @@ -224,16 +279,24 @@ interface IEigenPod { function podOwner() external view returns (address); /// @notice Returns the validatorInfo struct for the provided pubkeyHash - function validatorPubkeyHashToInfo(bytes32 validatorPubkeyHash) external view returns (ValidatorInfo memory); + 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); + 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); + 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); + 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 (uint256); @@ -275,11 +338,15 @@ interface IEigenPod { /// - 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); + 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); + function getParentBlockRoot( + uint64 timestamp + ) external view returns (bytes32); } diff --git a/src/contracts/interfaces/IEigenPodManager.sol b/src/contracts/interfaces/IEigenPodManager.sol index cbe253382..2ace138eb 100644 --- a/src/contracts/interfaces/IEigenPodManager.sol +++ b/src/contracts/interfaces/IEigenPodManager.sol @@ -5,6 +5,7 @@ import "@openzeppelin/contracts/proxy/beacon/IBeacon.sol"; import "./IETHPOSDeposit.sol"; import "./IStrategyManager.sol"; import "./IEigenPod.sol"; +import "./IShareManager.sol"; import "./IPausable.sol"; import "./ISlasher.sol"; import "./IStrategy.sol"; @@ -14,7 +15,20 @@ import "./IStrategy.sol"; * @author Layr Labs, Inc. * @notice Terms of Service: https://docs.eigenlayer.xyz/overview/terms-of-service */ -interface IEigenPodManager is IPausable { +interface IEigenPodManager is IShareManager, IPausable { + /// @dev Thrown when caller is not a EigenPod. + error OnlyEigenPod(); + /// @dev Thrown when caller is not DelegationManager. + error OnlyDelegationManager(); + /// @dev Thrown when caller already has an EigenPod. + error EigenPodAlreadyExists(); + /// @dev Thrown when shares is not a multiple of gwei. + error SharesNotMultipleOfGwei(); + /// @dev Thrown when shares would result in a negative integer. + error SharesNegative(); + /// @dev Thrown when the strategy is not the beaconChainETH strategy. + error InvalidStrategy(); + /// @notice Emitted to notify the deployment of an EigenPod event PodDeployed(address indexed eigenPod, address indexed podOwner); @@ -64,10 +78,14 @@ interface IEigenPodManager is IPausable { function recordBeaconChainETHBalanceUpdate(address podOwner, int256 sharesDelta) external; /// @notice Returns the address of the `podOwner`'s EigenPod if it has been deployed. - function ownerToPod(address podOwner) external view returns (IEigenPod); + 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); + function getPod( + address podOwner + ) external view returns (IEigenPod); /// @notice The ETH2 Deposit Contract function ethPOS() external view returns (IETHPOSDeposit); @@ -82,7 +100,9 @@ interface IEigenPodManager is IPausable { function slasher() external view returns (ISlasher); /// @notice Returns 'true' if the `podOwner` has created an EigenPod, and 'false' otherwise. - function hasPod(address podOwner) external view returns (bool); + function hasPod( + address podOwner + ) external view returns (bool); /// @notice Returns the number of EigenPods that have been created function numPods() external view returns (uint256); @@ -95,34 +115,10 @@ interface IEigenPodManager is IPausable { * 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 (int256); + function podOwnerShares( + address podOwner + ) external view returns (int256); /// @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, uint256 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, uint256 shares) external returns (uint256); - - /** - * @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, uint256 shares) external; } diff --git a/src/contracts/interfaces/IPausable.sol b/src/contracts/interfaces/IPausable.sol index 061712653..38b39bf42 100644 --- a/src/contracts/interfaces/IPausable.sol +++ b/src/contracts/interfaces/IPausable.sol @@ -20,6 +20,17 @@ import "../interfaces/IPauserRegistry.sol"; * 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. + error OnlyPauser(); + /// @dev Thrown when caller is not unpauser. + error OnlyUnpauser(); + /// @dev Thrown when currently paused. + error CurrentlyPaused(); + /// @dev Thrown when invalid `newPausedStatus` is provided. + error InvalidNewPausedStatus(); + /// @dev Thrown when a null address input is provided. + error InputAddressZero(); + /// @notice Emitted when the `pauserRegistry` is set to `newPauserRegistry`. event PauserRegistrySet(IPauserRegistry pauserRegistry, IPauserRegistry newPauserRegistry); @@ -38,7 +49,9 @@ interface IPausable { * @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(uint256 newPausedStatus) external; + function pause( + uint256 newPausedStatus + ) external; /** * @notice Alias for `pause(type(uint256).max)`. @@ -51,14 +64,20 @@ interface IPausable { * @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(uint256 newPausedStatus) external; + function unpause( + uint256 newPausedStatus + ) external; /// @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(uint8 index) external view returns (bool); + function paused( + uint8 index + ) external view returns (bool); /// @notice Allows the unpauser to set a new pauser registry - function setPauserRegistry(IPauserRegistry newPauserRegistry) external; + function setPauserRegistry( + IPauserRegistry newPauserRegistry + ) external; } diff --git a/src/contracts/interfaces/IPauserRegistry.sol b/src/contracts/interfaces/IPauserRegistry.sol index cd0b95546..e20fd77a7 100644 --- a/src/contracts/interfaces/IPauserRegistry.sol +++ b/src/contracts/interfaces/IPauserRegistry.sol @@ -7,12 +7,17 @@ pragma solidity >=0.5.0; * @notice Terms of Service: https://docs.eigenlayer.xyz/overview/terms-of-service */ interface IPauserRegistry { + error OnlyUnpauser(); + error InputAddressZero(); + 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(address pauser) external view returns (bool); + function isPauser( + address pauser + ) external view returns (bool); /// @notice Unique address that holds the unpauser role. Capable of changing *both* the pauser and unpauser addresses. function unpauser() external view returns (address); diff --git a/src/contracts/interfaces/IRewardsCoordinator.sol b/src/contracts/interfaces/IRewardsCoordinator.sol index d3f5beaf2..a265c26cf 100644 --- a/src/contracts/interfaces/IRewardsCoordinator.sol +++ b/src/contracts/interfaces/IRewardsCoordinator.sol @@ -1,7 +1,8 @@ // SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.12; +pragma solidity ^0.8.27; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import "./IAVSDirectory.sol"; import "./IStrategy.sol"; /** @@ -14,7 +15,68 @@ import "./IStrategy.sol"; * a Merkle root against which Stakers & Operators can make claims. */ interface IRewardsCoordinator { + /// @dev Thrown when input `amount` exceeds maximum. + error AmountExceedsMax(); + /// @dev Thrown when input `amount` is zero. + error AmountZero(); + /// @dev Thrown if provided commision bips exceeds maximum. + error CommissionBipsExceedsMax(); + /// @dev Thrown when input `duration` exceeds maximum. + error DurationExceedsMax(); + /// @dev Thrown when input `duration` is not evenly divisble by CALCULATION_INTERVAL_SECONDS. + error DurationNotMultipleOfCalculationIntervalSeconds(); + /// @dev Thrown when cummulative earnings are not greater than cummulative claimed. + error EarningsNotGreaterThanClaimed(); + /// @dev Thrown when claim is attempted by invalid claimer. + error InvalidClaimer(); + /// @dev Thrown when an invalid earn leaf index is provided. + error InvalidEarnerLeafIndex(); + /// @dev Thrown when an invalid earner claim proof is provided. + error InvalidClaimProof(); + /// @dev Thrown when an invalid operator set is provided. + error InvalidOperatorSet(); + /// @dev Thrown when an invalid root is provided. + error InvalidRoot(); + /// @dev Thrown when an invalid root index is provided. + error InvalidRootIndex(); + /// @dev Thrown when an invalid token leaf index is provided. + error InvalidTokenLeafIndex(); + /// @dev Thrown when an attempt to use a non-whitelisted strategy is made. + error InvalidStrategy(); + /// @dev Thrown when two array parameters have mismatching lengths. + error InputArrayLengthMismatch(); + /// @dev Thrown when input arrays length is zero. + error InputArrayLengthZero(); + /// @dev Thrown when provided root is not for new calculated period. + error NewRootMustBeForNewCalculatedPeriod(); + /// @dev Thrown when call is attempted by address that's not a rewards for all submitter. + error OnlyRewardsForAllSubmitter(); + /// @dev Thrown when call is attempted by address that's not the rewards updater. + error OnlyRewardsUpdater(); + /// @dev Thrown when rewards end timestamp has not elapsed. + error RewardsEndTimestampNotElapsed(); + /// @dev Thrown if a root has already been activated. + error RootActivated(); + /// @dev Thrown if a root has already been disabled. + error RootDisabled(); + /// @dev Thrown if a root has not been activated yet. + error RootNotActivated(); + /// @dev Thrown when `startTimestamp` is not evenly divisble by CALCULATION_INTERVAL_SECONDS. + error StartTimestampNotMultipleOfCalculationIntervalSeconds(); + /// @dev Thrown when `startTimestamp` is too far in the future. + error StartTimestampTooFarInFuture(); + /// @dev Thrown when `startTimestamp` is too far in the past. + error StartTimestampTooFarInPast(); + /// @dev Thrown when `strategies` is not sorted in ascending order. + error StrategiesNotInAscendingOrder(); + /// STRUCTS /// + + /// @notice Reward type + enum RewardType { + DELEGATED_STAKE + } + /** * @notice A linear combination of strategies and multipliers for AVSs to weigh * EigenLayer strategies. @@ -59,6 +121,32 @@ interface IRewardsCoordinator { uint32 startTimestamp; uint32 duration; } + /** + * @notice OperatorSetRewardsSubmission struct submitted by AVSs when making rewards to operatorSets + * @notice The retroactive range applies from RewardsSubmission + * @param RewardType The type of reward to be distributed for. + * @param operatorSetId The operatorSetId to distribute rewards to + * @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 + * @dev The sliding window from `RewardsSubmission` applies to `OperatorSetRewardsSubmission`, with + * using `OPERATOR_SET_GENESIS_REWARDS_TIMESTAMP` instead of `GENESIS_REWARDS_TIMESTAMP` and + * `OPERATOR_SET_MAX_RETROACTIVE_LENGTH` instead of `MAX_RETROACTIVE_LENGTH` + */ + + struct OperatorSetRewardsSubmission { + RewardType rewardType; + uint32 operatorSetId; + StrategyAndMultiplier[] strategiesAndMultipliers; + IERC20 token; + uint256 amount; + uint32 startTimestamp; + uint32 duration; + } /** * @notice A distribution root is a merkle root of the distribution of earnings for a given period. @@ -127,6 +215,12 @@ interface IRewardsCoordinator { TokenTreeMerkleLeaf[] tokenLeaves; } + /// @notice used for setting operator commission bips per operator set + struct OperatorCommissionUpdate { + uint16 commissionBips; + uint32 effectTimestamp; + } + /// EVENTS /// /// @notice emitted when an AVS creates a valid RewardsSubmission @@ -136,6 +230,15 @@ interface IRewardsCoordinator { bytes32 indexed rewardsSubmissionHash, RewardsSubmission rewardsSubmission ); + + /// @notice emitted when an AVS creates a valid OperatorSetRewardsSubmission + event OperatorSetRewardCreated( + address indexed avs, + uint256 indexed submissionNonce, + bytes32 indexed rewardsSubmissionHash, + OperatorSetRewardsSubmission rewardsSubmission + ); + /// @notice emitted when a valid RewardsSubmission is created for all stakers by a valid submitter event RewardsSubmissionForAllCreated( address indexed submitter, @@ -152,12 +255,24 @@ interface IRewardsCoordinator { ); /// @notice rewardsUpdater is responsible for submiting DistributionRoots, only owner can set rewardsUpdater event RewardsUpdaterSet(address indexed oldRewardsUpdater, address indexed newRewardsUpdater); + event RewardsForAllSubmitterSet( address indexed rewardsForAllSubmitter, bool indexed oldValue, bool indexed newValue ); + event ActivationDelaySet(uint32 oldActivationDelay, uint32 newActivationDelay); + event GlobalCommissionBipsSet(uint16 oldGlobalCommissionBips, uint16 newGlobalCommissionBips); + /// @notice emitted when an operator commission is set for a specific OperatorSet and RewardType + event OperatorCommissionUpdated( + address indexed operator, + OperatorSet indexed operatorSet, + RewardType rewardType, + uint16 newCommissionBips, + uint32 effectTimestamp + ); 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( uint32 indexed rootIndex, @@ -165,7 +280,9 @@ interface IRewardsCoordinator { uint32 indexed rewardsCalculationEndTimestamp, uint32 activatedAt ); + event DistributionRootDisabled(uint32 indexed rootIndex); + /// @notice root is one of the submitted distribution roots that was claimed against event RewardsClaimed( bytes32 root, @@ -207,7 +324,9 @@ interface IRewardsCoordinator { function activationDelay() external view returns (uint32); /// @notice Mapping: earner => the address of the entity who can call `processClaim` on behalf of the earner - function claimerFor(address earner) external view returns (address); + function claimerFor( + address earner + ) external view returns (address); /// @notice Mapping: claimer => token => total amount claimed function cumulativeClaimed(address claimer, IERC20 token) external view returns (uint256); @@ -217,17 +336,27 @@ interface IRewardsCoordinator { /// @notice the commission for a specific operator for a specific avs /// NOTE: Currently unused and simply returns the globalOperatorCommissionBips value but will be used in future release - function operatorCommissionBips(address operator, address avs) external view returns (uint16); + function getOperatorCommissionBips( + address operator, + OperatorSet calldata operatorSet, + RewardType rewardType + ) external view returns (uint16); /// @notice return the hash of the earner's leaf - function calculateEarnerLeafHash(EarnerTreeMerkleLeaf calldata leaf) external pure returns (bytes32); + function calculateEarnerLeafHash( + EarnerTreeMerkleLeaf calldata leaf + ) external pure returns (bytes32); /// @notice returns the hash of the earner's token leaf - function calculateTokenLeafHash(TokenTreeMerkleLeaf calldata leaf) external pure returns (bytes32); + function calculateTokenLeafHash( + TokenTreeMerkleLeaf calldata leaf + ) external pure returns (bytes32); /// @notice returns 'true' if the claim would currently pass the check in `processClaims` /// but will revert if not valid - function checkClaim(RewardsMerkleClaim calldata claim) external view returns (bool); + function checkClaim( + RewardsMerkleClaim calldata claim + ) external view returns (bool); /// @notice The timestamp until which RewardsSubmissions have been calculated function currRewardsCalculationEndTimestamp() external view returns (uint32); @@ -236,7 +365,9 @@ interface IRewardsCoordinator { function getDistributionRootsLength() external view returns (uint256); /// @notice returns the distributionRoot at the specified index - function getDistributionRootAtIndex(uint256 index) external view returns (DistributionRoot memory); + function getDistributionRootAtIndex( + uint256 index + ) external view returns (DistributionRoot memory); /// @notice returns the current distributionRoot function getCurrentDistributionRoot() external view returns (DistributionRoot memory); @@ -246,7 +377,16 @@ interface IRewardsCoordinator { function getCurrentClaimableDistributionRoot() external view returns (DistributionRoot memory); /// @notice loop through distribution roots from reverse and return index from hash - function getRootIndexFromHash(bytes32 rootHash) external view returns (uint32); + function getRootIndexFromHash( + bytes32 rootHash + ) external view returns (uint32); + + /// @notice returns the length of the operator commission update history + function getOperatorCommissionUpdateHistoryLength( + address operator, + OperatorSet calldata operatorSet, + RewardType rewardType + ) external view returns (uint256); /** * @@ -255,7 +395,9 @@ interface IRewardsCoordinator { */ /** - * @notice Creates a new rewards submission on behalf of an AVS, to be split amongst the + * @notice Legacy interface to be DEPRECATED in future releases. See rewardOperatorSetForRange + * for a more updated interface. + * 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 @@ -265,23 +407,35 @@ interface IRewardsCoordinator { * @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(RewardsSubmission[] calldata rewardsSubmissions) external; + function createAVSRewardsSubmission( + RewardsSubmission[] calldata rewardsSubmissions + ) external; /** - * @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. + * @notice Creates a new rewards submission on behalf of an AVS for a given operatorSet, + * to be split amongst the set of stakers delegated to operators who are + * registered to the msg.sender AVS and the given operatorSetId + * + * @param rewardsSubmissions The operatorSet rewards submission being created for + * + * @dev msg.sender is the AVS in the operatorSet the rewards submission is being made to + * @dev AVSs set their reward type depending on what metric they want rewards + * distributed proportional to + * @dev The tokens in the rewards submissions are sent to the `RewardsCoordinator` contract + * @dev Strategies of each rewards submission must be in ascending order of addresses to check for duplicates */ - function createRewardsForAllSubmission(RewardsSubmission[] calldata rewardsSubmission) external; + function rewardOperatorSetForRange( + OperatorSetRewardsSubmission[] calldata rewardsSubmissions + ) external; /** - * @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 + * @notice similar to `createAVSRewardsSubmission` except the rewards are split amongst *all* stakers + * rather than just those delegated to operators who are registered to a single avs and is + * a permissioned call based on isRewardsForAllSubmitter mapping. */ - function createRewardsForAllEarners(RewardsSubmission[] calldata rewardsSubmissions) external; + function createRewardsForAllSubmission( + RewardsSubmission[] calldata rewardsSubmission + ) external; /** * @notice Claim rewards against a given root (read from _distributionRoots[claim.rootIndex]). @@ -309,34 +463,44 @@ interface IRewardsCoordinator { * @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(uint32 rootIndex) external; + function disableRoot( + uint32 rootIndex + ) external; /** * @notice Sets the address of the entity that can call `processClaim` on behalf of the earner (msg.sender) * @param claimer The address of the entity that can claim rewards on behalf of the earner * @dev Only callable by the `earner` */ - function setClaimerFor(address claimer) external; + function setClaimerFor( + address claimer + ) external; /** * @notice Sets the delay in timestamp before a posted root can be claimed against * @param _activationDelay Delay in timestamp (seconds) before a posted root can be claimed against * @dev Only callable by the contract owner */ - function setActivationDelay(uint32 _activationDelay) external; + function setActivationDelay( + uint32 _activationDelay + ) external; /** * @notice Sets the global commission for all operators across all avss * @param _globalCommissionBips The commission for all operators across all avss * @dev Only callable by the contract owner */ - function setGlobalOperatorCommission(uint16 _globalCommissionBips) external; + function setGlobalOperatorCommission( + uint16 _globalCommissionBips + ) external; /** * @notice Sets the permissioned `rewardsUpdater` address which can post new roots * @dev Only callable by the contract owner */ - function setRewardsUpdater(address _rewardsUpdater) external; + function setRewardsUpdater( + address _rewardsUpdater + ) external; /** * @notice Sets the permissioned `rewardsForAllSubmitter` address which can submit createRewardsForAllSubmission @@ -345,4 +509,20 @@ interface IRewardsCoordinator { * @param _newValue The new value for isRewardsForAllSubmitter */ function setRewardsForAllSubmitter(address _submitter, bool _newValue) external; + + /** + * @notice Sets the commission an operator takes in bips for a given reward type and operatorSet + * @param operatorSet The operatorSet to update commission for + * @param rewardType The associated rewardType to update commission for + * @param commissionBips The commission in bips for the operator, must be <= MAX_COMMISSION_BIPS + * @return effectTimestamp The timestamp at which the operator commission update will take effect + * + * @dev The commission can range from 1 to 10000 + * @dev The commission update takes effect after 7 days + */ + function setOperatorCommissionBips( + OperatorSet calldata operatorSet, + RewardType rewardType, + uint16 commissionBips + ) external returns (uint32); } diff --git a/src/contracts/interfaces/IShareManager.sol b/src/contracts/interfaces/IShareManager.sol new file mode 100644 index 000000000..2bccc2e7b --- /dev/null +++ b/src/contracts/interfaces/IShareManager.sol @@ -0,0 +1,32 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.27; + +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import "./IStrategy.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 + function removeShares(address staker, IStrategy strategy, uint256 shares) external; + + /// @notice Used by the DelegationManager to award a Staker some shares that have passed through the withdrawal queue + /// @dev strategy must be beaconChainETH when talking to the EigenPodManager + /// @dev token is not validated when talking to the EigenPodManager + function addShares(address staker, IERC20 token, IStrategy strategy, uint256 shares) external; + + /// @notice Used by the DelegationManager to convert withdrawn descaled shares to tokens and send them to a recipient + /// @dev strategy must be beaconChainETH when talking to the EigenPodManager + /// @dev token is not validated when talking to the EigenPodManager + function withdrawSharesAsTokens(address recipient, IStrategy strategy, uint256 shares, IERC20 token) external; + + /// @notice Returns the current shares of `user` in `strategy` + /// @dev strategy must be beaconChainETH when talking to the EigenPodManager + /// @dev returns 0 if the user has negative shares + function stakerStrategyShares(address user, IStrategy strategy) external view returns (uint256 shares); +} diff --git a/src/contracts/interfaces/ISlasher.sol b/src/contracts/interfaces/ISlasher.sol index f2b4952be..1cd77b996 100644 --- a/src/contracts/interfaces/ISlasher.sol +++ b/src/contracts/interfaces/ISlasher.sol @@ -55,7 +55,9 @@ interface ISlasher { * @notice Gives the `contractAddress` permission to slash the funds of the caller. * @dev Typically, this function must be called prior to registering for a middleware. */ - function optIntoSlashing(address contractAddress) external; + function optIntoSlashing( + address contractAddress + ) external; /** * @notice Used for 'slashing' a certain operator. @@ -63,13 +65,17 @@ interface ISlasher { * @dev Technically the operator is 'frozen' (hence the name of this function), and then subject to slashing pending a decision by a human-in-the-loop. * @dev The operator must have previously given the caller (which should be a contract) the ability to slash them, through a call to `optIntoSlashing`. */ - function freezeOperator(address toBeFrozen) external; + function freezeOperator( + address toBeFrozen + ) external; /** * @notice Removes the 'frozen' status from each of the `frozenAddresses` * @dev Callable only by the contract owner (i.e. governance). */ - function resetFrozenStatus(address[] calldata frozenAddresses) external; + function resetFrozenStatus( + address[] calldata frozenAddresses + ) external; /** * @notice this function is a called by middlewares during an operator's registration to make sure the operator's stake at registration @@ -121,7 +127,9 @@ interface ISlasher { * @return Returns 'true' if `staker` themselves has their status set to frozen, OR if the staker is delegated * to an operator who has their status set to frozen. Otherwise returns 'false'. */ - function isFrozen(address staker) external view returns (bool); + function isFrozen( + address staker + ) external view returns (bool); /// @notice Returns true if `slashingContract` is currently allowed to slash `toBeSlashed`. function canSlash(address toBeSlashed, address slashingContract) external view returns (bool); @@ -171,7 +179,9 @@ interface ISlasher { ) external view returns (MiddlewareTimes memory); /// @notice Getter function for fetching `operatorToMiddlewareTimes[operator].length` - function middlewareTimesLength(address operator) external view returns (uint256); + function middlewareTimesLength( + address operator + ) external view returns (uint256); /// @notice Getter function for fetching `operatorToMiddlewareTimes[operator][index].stalestUpdateBlock`. function getMiddlewareTimesIndexStalestUpdateBlock(address operator, uint32 index) external view returns (uint32); @@ -180,7 +190,9 @@ interface ISlasher { function getMiddlewareTimesIndexServeUntilBlock(address operator, uint32 index) external view returns (uint32); /// @notice Getter function for fetching `_operatorToWhitelistedContractsByUpdate[operator].size`. - function operatorWhitelistedContractsLinkedListSize(address operator) external view returns (uint256); + function operatorWhitelistedContractsLinkedListSize( + address operator + ) external view returns (uint256); /// @notice Getter function for fetching a single node in the operator's linked list (`_operatorToWhitelistedContractsByUpdate[operator]`). function operatorWhitelistedContractsLinkedListEntry( diff --git a/src/contracts/interfaces/ISocketUpdater.sol b/src/contracts/interfaces/ISocketUpdater.sol index df95d4ab0..921b1a46b 100644 --- a/src/contracts/interfaces/ISocketUpdater.sol +++ b/src/contracts/interfaces/ISocketUpdater.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.12; +pragma solidity ^0.8.27; /** * @title Interface for an `ISocketUpdater` where operators can update their sockets. @@ -16,5 +16,7 @@ interface ISocketUpdater { * @notice Updates the socket of the msg.sender given they are a registered operator * @param socket is the new socket of the operator */ - function updateSocket(string memory socket) external; + function updateSocket( + string memory socket + ) external; } diff --git a/src/contracts/interfaces/IStakeRootCompendium.sol b/src/contracts/interfaces/IStakeRootCompendium.sol new file mode 100644 index 000000000..35588204c --- /dev/null +++ b/src/contracts/interfaces/IStakeRootCompendium.sol @@ -0,0 +1,334 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.12; + +import "../interfaces/IAVSDirectory.sol"; +import "../interfaces/IDelegationManager.sol"; +import "../interfaces/IStrategy.sol"; + +interface IStakeRootCompendium { + // TODO: Rename these... + error NonexistentOperatorSet(); + error NonexistentStrategy(); + error InsufficientDepositBalance(); + error NotInStakeTree(); + error OperatorSetNotOldEnough(); + error EthTransferFailed(); + error TimestampNotMultipleOfProofInterval(); + error TimestampAlreadyPosted(); + error TimestampOfIndexChargePerProofIsGreaterThanCalculationTimestamp(); + error IndexChargePerProofNotValid(); + error OnlyRootConfirmerCanConfirm(); + error StakeRootDoesNotMatch(); + error TimestampAlreadyConfirmed(); + error MaxTotalChargeMustBeGreaterThanTheCurrentTotalCharge(); + error NoProofsThatHaveBeenChargedButNotSubmitted(); + error ChargePerProofExceedsMax(); + error InputArrayLengthMismatch(); + error InputCorrelatedVariableMismatch(); + error OperatorSetIndexOutOfBounds(); + error OperatorSetMustExist(); + error OperatorSetSizeMismatch(); + + /** + * @dev Struct containing charges for operator sets, strategies, and max total charge. + * @param chargePerOperatorSet The linear charge per proof in the number of strategies. + * @param chargePerStrategy The constant charge per proof. + * @param The max total charge for a stakeroot proof, used to bound computation offchain. + */ + struct ChargeParams { + uint96 chargePerOperatorSet; + uint96 chargePerStrategy; + uint96 maxChargePerProof; + } + + /** + * @dev Struct containing info about cumulative charges. + * @param chargePerOperatorSet The cumulative constant charge per operator set since deployment. + * @param chargePerStrategy The cumulative linear charge per strategy per operator set since deployment. + * @param lastUpdateTimestamp The last time cumulative charges were updated. + * @param proofIntervalSeconds The interval in seconds at which proofs can be posted. + */ + + struct CumulativeChargeParams { + uint96 chargePerOperatorSet; + uint96 chargePerStrategy; + uint32 lastUpdateTimestamp; + uint32 proofIntervalSeconds; + } + + struct StrategyAndMultiplier { + IStrategy strategy; + uint96 multiplier; + } + + // TODO + struct Proof { + uint32 x; + } + + struct OperatorLeaf { + uint256 delegatedStake; + uint256 slashableStake; + bytes32 extraData; + } + + struct DepositInfo { + // the balance of the operatorSet (includes pending deductions) + uint96 balance; + // the timestamp of the operatorSets latest deposit or increase in number of strategies. + // withdrawals of deposit balance are bounded by paying for MIN_PREPAID_PROOFS proofs since + // ones latest demand increase + uint32 lastDemandIncreaseTimestamp; + // the cumulativeChargePerOperatorSet at the time of the lastest deduction from the deposit balance + // used in making further deductions + uint96 cumulativeChargePerOperatorSetLastPaid; + // the cumulativeChargePerStrategy at the time of the lastest deduction from the deposit balance + // used in making further deductions + uint96 cumulativeChargePerStrategyLastPaid; + } + + struct StakeRootSubmission { + bytes32 stakeRoot; + uint32 calculationTimestamp; // the timestamp of the state the stakeRoot was calculated against + uint32 submissionTimestamp; // the timestamp of the submission + bool confirmed; // whether the rootConfimer has confirmed the root + } + + event SnarkProofVerified(bytes journal, bytes seal); + event VerifierSet(address newVerifier); + event ImageIdSet(bytes32 newImageId); + + function MIN_BALANCE_THRESHOLD() external view returns (uint256); + + function delegationManager() external view returns (IDelegationManager); + function avsDirectory() external view returns (IAVSDirectory); + function verifier() external view returns (address); + function imageId() external view returns (bytes32); + + /// @notice the number of operator sets in the StakeTree + function getNumOperatorSets() external view returns (uint256); + + /** + * @notice returns the stake root submission at the given index + * @param index the index of the stake root submission + */ + function getStakeRootSubmission( + uint32 index + ) external view returns (StakeRootSubmission memory); + + /// @notice the number of stake root submissions + function getNumStakeRootSubmissions() external view returns (uint256); + + /** + * @notice returns the operatorSet at the given timestamp + * @param operatorSet the operatorSet to get the indec for + * @param timestamp the timestamp to get the index for + * @return index the index of the operatorSet + */ + function getOperatorSetIndexAtTimestamp(OperatorSet memory operatorSet, uint32 timestamp) + external + view + returns (uint224); + + /** + * @notice returns the delegated and slashable stakes for an operator in an operatorSet + * @param operatorSet the operatorSet to get the stakes for + * @param operator the operator to get the stakes for + * @return delegatedStake the delegated stake for the operator + * @return slashableStake the slashable stake for the operator + */ + function getStakes( + OperatorSet calldata operatorSet, + address operator + ) external view returns (uint256 delegatedStake, uint256 slashableStake); + + /** + * @notice called offchain with the operatorSet roots ordered by the operatorSet index at the timestamp to calculate the stake root + * @param operatorSetsInStakeTree the operatorSets ids that each of the operatorSetRoots correspond to. must be the same as operatorSets storage var at the time of call + * @param operatorSetRoots the ordered operatorSet roots (not verified) + * @dev operatorSetsInStakeTree must be the same as operatorSets storage var at the time of call + * @dev operatorSetRoots must be ordered by the operatorSet index at the time of call + */ + function getStakeRoot( + OperatorSet[] calldata operatorSetsInStakeTree, + bytes32[] calldata operatorSetRoots + ) external view returns (bytes32); + + /** + * @notice Returns the operatorSet root for the given operatorSetIndex with the given witnesses + * @param operatorSetIndex the operatorSetIndex to get the operatorSet root for + * @param operatorLeaves the operator leaves in the operatorSet + * @dev leaves must be sorted by extraData + */ + function getOperatorSetRoot( + uint32 operatorSetIndex, + OperatorLeaf[] calldata operatorLeaves + ) external view returns (bytes32); + + /** + * @notice Returns the operatorSet leaves for the operatorSet at a given index for a certain set of operators + * @param operatorSetIndex the index of the operatorSet within the SRC's operatorSets list to calculate the operator set leaves for + * @param startOperatorIndex the index of the first operator to get the leaves for + * @param numOperators the number of operators to get the leaves for + * @return the operator leaves + */ + function getOperatorSetLeaves( + uint256 operatorSetIndex, + uint256 startOperatorIndex, + uint256 numOperators + ) external view returns (OperatorLeaf[] memory); + + /// @notice Returns the interval at which proofs can be posted, to not overcharge the operatorSets. + function proofIntervalSeconds() external view returns (uint32); + + /** + * @notice deposits funds for an operator set + * @param operatorSet the operator set to deposit for + * @dev must be called before adding strategies and multipliers to the operator set + * @dev the operator set must have a minimum balance of 2 * MIN_DEPOSIT_BALANCE to disallow joining with minimal cost after removal + * @dev permissionless to deposit + */ + function deposit( + OperatorSet calldata operatorSet + ) external payable; + + /** + * @notice called by an AVS to add strategies and multipliers or modify multipliers used to determine stakes for stake roots + * @param operatorSetId the id of the operatorSet to set the strategies and multipliers for + * @param strategiesAndMultipliers the strategies and multipliers to set for the operatorSet + * @dev msg.sender is used as the AVS in determining the operatorSet + */ + function addOrModifyStrategiesAndMultipliers( + uint32 operatorSetId, + StrategyAndMultiplier[] calldata strategiesAndMultipliers + ) external; + + /** + * @notice called by an AVS to remove their strategies and multipliers used to determine stakes for stake roots + * @param operatorSetId the id of the operatorSet to remove the strategies and multipliers for + * @param strategies the strategies to remove for the operatorSet + * @dev msg.sender is used as the AVS in determining the operatorSet + */ + function removeStrategiesAndMultipliers(uint32 operatorSetId, IStrategy[] calldata strategies) external; + + /** + * @notice Withdraws an amount from the operator set's deposit balance + * @param operatorSetId The ID of the operator set to withdraw from + * @param amount The amount to withdraw + * @return The amount actually withdrawn + * @dev If the operator set's deposit balance is less than the minimum deposit balance, the operator set is removed and any excess amount is returned + */ + function withdraw(uint32 operatorSetId, uint256 amount) external payable returns (uint256); + + /** + * @notice called by an AVS to add extraData to an operatorSet to be added to right subtree of the operatorSetTree + * @param operatorSetId the id of the operatorSet to set the extraData for + * @param extraData the extraData + */ + function setOperatorSetExtraData(uint32 operatorSetId, bytes32 extraData) external; + + /** + * @notice called by an AVS to add extraData to an operator for an operatorSet to be added to leaves of the tree + * @param operatorSetId the id of the operatorSet to set the extraData for + * @param operator the operator to set the extraData for + * @param extraData the extraData + */ + function setOperatorExtraData(uint32 operatorSetId, address operator, bytes32 extraData) external; + + /** + * @notice called by watchers to update the deposit balance infos for operatorSets that have + * fallen below the minimum balance, in order to remove them from the stakeTree + * @param operatorSetsToRemove the operatorSets to update the deposit balance infos for + * @dev sends the caller the leftover after charging if the balance is below the minimum + */ + function removeOperatorSetsFromStakeTree( + OperatorSet[] calldata operatorSetsToRemove + ) external; + + /** + * @notice called by the claimer to claim a stake root + * @param _calculationTimestamp the timestamp of the state the stakeRoot was calculated against + * @param _stakeRoot the stakeRoot at calculationTimestamp + * @param _chargeRecipient the address to send the charge to when processed + * @param _indexChargePerProof the index of the charge per proof to use + * @param _proof todo + * @dev permissionless to call + */ + function verifyStakeRoot( + uint256 _calculationTimestamp, + bytes32 _stakeRoot, + address _chargeRecipient, + uint256 _indexChargePerProof, + Proof calldata _proof + ) external; + + /** + * @notice called by governance + * @param calculationTimestamp the timestamp of the state the stakeRoot was calculated against + * @param stakeRoot the stakeRoot at calculationTimestamp + * @dev only callable by governance when a root has not been posted in forcePostWindow + */ + function confirmStakeRoot(uint32 calculationTimestamp, bytes32 stakeRoot) external; + + /** + * @param numStrategies the number of strategies the operatorSet has + * @return the minimum deposit balance required for the operatorSet, which is just enough to pay for a certain number of proofs + * @dev this is enforced upon deposits and additions or modifications of strategies and multipliers + */ + function minDepositBalance( + uint256 numStrategies + ) external view returns (uint256); + + /** + * @param operatorSet the operatorSet to check withdrawability for + * @return whether or not the operatorSet can withdraw any of their deposit balance + */ + function canWithdrawDepositBalance( + OperatorSet memory operatorSet + ) external view returns (bool); + + /** + * @notice get the deposit balance for the operator set + * @param operatorSet the operator set to get the deposit balance for + * @return balance the deposit balance for the operator set + */ + function getDepositBalance( + OperatorSet memory operatorSet + ) external view returns (uint256 balance); + + /** + * @notice set the maximum charge for a stakeRoot proof + * @param _maxChargePerProof the maximum charge for a stakeRoot proof + * @dev only callable by owner + * @dev used to limit offchain computation + */ + function setMaxChargePerProof( + uint96 _maxChargePerProof + ) external; + + /** + * @notice set the charges per proof going forward from the time of calling + * @param _chargePerStrategy the charge per strategy per operatorSet per proof + * @param _chargePerOperatorSet the flat charge per operatorSet per proof + * @dev only callable by owner + */ + function setChargePerProof(uint96 _chargePerStrategy, uint96 _chargePerOperatorSet) external; + + /** + * @notice set the proof interval in seconds + * @param _proofIntervalSeconds the interval in seconds at which proofs can be posted + * @dev only callable by owner + */ + function setProofIntervalSeconds( + uint32 _proofIntervalSeconds + ) external; + + /** + * @notice set the confirmer of roots + * @param _rootConfirmer the address allowed to confirm roots + * @dev only callable by owner + */ + function setRootConfirmer( + address _rootConfirmer + ) external; +} diff --git a/src/contracts/interfaces/IStrategy.sol b/src/contracts/interfaces/IStrategy.sol index e7a6f684d..afeace90a 100644 --- a/src/contracts/interfaces/IStrategy.sol +++ b/src/contracts/interfaces/IStrategy.sol @@ -10,6 +10,21 @@ import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; * @notice Custom `Strategy` implementations may expand extensively on this interface. */ interface IStrategy { + /// @dev Thrown when balance exceeds max total deposits. + error BalanceExceedsMaxTotalDeposits(); + /// @dev Thrown when called by an account that is not strategy manager. + error OnlyStrategyManager(); + /// @dev Thrown when new shares value is zero. + error NewSharesZero(); + /// @dev Thrown when total shares exceeds max. + error TotalSharesExceedsMax(); + /// @dev Thrown when amount shares is greater than total shares. + error WithdrawalAmountExceedsDeposit(); + /// @dev Thrown when attempting an action with a token that is not accepted. + error OnlyUnderlyingToken(); + /// @dev Thrown when `maxPerDeposit` exceeds max. + error MaxPerDepositExceedsMax(); + /** * @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 @@ -52,7 +67,9 @@ interface IStrategy { * @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(uint256 amountShares) external returns (uint256); + function sharesToUnderlying( + uint256 amountShares + ) external returns (uint256); /** * @notice Used to convert an amount of underlying tokens to the equivalent amount of shares in this strategy. @@ -61,19 +78,25 @@ interface IStrategy { * @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 underlyingToShares(uint256 amountUnderlying) external returns (uint256); + function underlyingToShares( + uint256 amountUnderlying + ) external returns (uint256); /** * @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(address user) external returns (uint256); + function userUnderlying( + address user + ) external returns (uint256); /** * @notice convenience function for fetching the current total shares of `user` in this strategy, by * querying the `strategyManager` contract */ - function shares(address user) external view returns (uint256); + function shares( + address user + ) external view returns (uint256); /** * @notice Used to convert a number of shares to the equivalent amount of underlying tokens for this strategy. @@ -82,7 +105,9 @@ interface IStrategy { * @return The amount of shares corresponding to the input `amountUnderlying` * @dev Implementation for these functions in particular may vary significantly for different strategies */ - function sharesToUnderlyingView(uint256 amountShares) external view returns (uint256); + function sharesToUnderlyingView( + uint256 amountShares + ) external view returns (uint256); /** * @notice Used to convert an amount of underlying tokens to the equivalent amount of shares in this strategy. @@ -91,13 +116,17 @@ interface IStrategy { * @return The amount of shares corresponding to the input `amountUnderlying` * @dev Implementation for these functions in particular may vary significantly for different strategies */ - function underlyingToSharesView(uint256 amountUnderlying) external view returns (uint256); + function underlyingToSharesView( + uint256 amountUnderlying + ) external view returns (uint256); /** * @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(address user) external view returns (uint256); + function userUnderlyingView( + address user + ) external view returns (uint256); /// @notice The underlying token for shares in this Strategy function underlyingToken() external view returns (IERC20); diff --git a/src/contracts/interfaces/IStrategyFactory.sol b/src/contracts/interfaces/IStrategyFactory.sol index 85dab8cd0..75d7e349a 100644 --- a/src/contracts/interfaces/IStrategyFactory.sol +++ b/src/contracts/interfaces/IStrategyFactory.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.12; +pragma solidity ^0.8.27; import "@openzeppelin/contracts/proxy/beacon/IBeacon.sol"; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; @@ -12,6 +12,13 @@ import "./IStrategy.sol"; * @dev This may not be compatible with non-standard ERC20 tokens. Caution is warranted. */ interface IStrategyFactory { + /// @dev Thrown when attempting to deploy a strategy for a blacklisted token. + error BlacklistedToken(); + /// @dev Thrown when attempting to deploy a strategy that already exists. + error StrategyAlreadyExists(); + /// @dev Thrown when attempting to blacklist a token that already has a deployed strategy. + error CannotBlacklistDeployedStrategy(); + event TokenBlacklisted(IERC20 token); /// @notice Upgradeable beacon which new Strategies deployed by this contract point to @@ -24,7 +31,9 @@ interface IStrategyFactory { /// 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(IERC20 token) external view returns (IStrategy); + function deployedStrategies( + IERC20 token + ) external view returns (IStrategy); /** * @notice Deploy a new strategyBeacon contract for the ERC20 token. @@ -33,25 +42,23 @@ interface IStrategyFactory { * $dev Immense caution is warranted for non-standard ERC20 tokens, particularly "reentrant" tokens * like those that conform to ERC777. */ - function deployNewStrategy(IERC20 token) external returns (IStrategy newStrategy); + function deployNewStrategy( + IERC20 token + ) external returns (IStrategy newStrategy); /** * @notice Owner-only function to pass through a call to `StrategyManager.addStrategiesToDepositWhitelist` */ function whitelistStrategies( - IStrategy[] calldata strategiesToWhitelist, - bool[] calldata thirdPartyTransfersForbiddenValues + IStrategy[] calldata strategiesToWhitelist ) external; - /** - * @notice Owner-only function to pass through a call to `StrategyManager.setThirdPartyTransfersForbidden` - */ - function setThirdPartyTransfersForbidden(IStrategy strategy, bool value) external; - /** * @notice Owner-only function to pass through a call to `StrategyManager.removeStrategiesFromDepositWhitelist` */ - function removeStrategiesFromWhitelist(IStrategy[] calldata strategiesToRemoveFromWhitelist) external; + function removeStrategiesFromWhitelist( + IStrategy[] calldata strategiesToRemoveFromWhitelist + ) external; /// @notice Emitted when the `strategyBeacon` is changed event StrategyBeaconModified(IBeacon previousBeacon, IBeacon newBeacon); diff --git a/src/contracts/interfaces/IStrategyManager.sol b/src/contracts/interfaces/IStrategyManager.sol index 565b301cd..43fbd53f6 100644 --- a/src/contracts/interfaces/IStrategyManager.sol +++ b/src/contracts/interfaces/IStrategyManager.sol @@ -2,6 +2,7 @@ pragma solidity >=0.5.0; import "./IStrategy.sol"; +import "./IShareManager.sol"; import "./ISlasher.sol"; import "./IDelegationManager.sol"; import "./IEigenPodManager.sol"; @@ -12,7 +13,28 @@ import "./IEigenPodManager.sol"; * @notice Terms of Service: https://docs.eigenlayer.xyz/overview/terms-of-service * @notice See the `StrategyManager` contract itself for implementation details. */ -interface IStrategyManager { +interface IStrategyManager is IShareManager { + /// @dev Thrown when total strategies deployed exceeds max. + error MaxStrategiesExceeded(); + /// @dev Thrown when two array parameters have mismatching lengths. + error InputArrayLengthMismatch(); + /// @dev Thrown when call attempted from address that's not delegation manager. + error OnlyDelegationManager(); + /// @dev Thrown when call attempted from address that's not strategy whitelister. + error OnlyStrategyWhitelister(); + /// @dev Thrown when provided `shares` amount is too high. + error SharesAmountTooHigh(); + /// @dev Thrown when provided `shares` amount is zero. + error SharesAmountZero(); + /// @dev Thrown when attempting to use an expired eip-712 signature. + error SignatureExpired(); + /// @dev Thrown when provided `staker` address is null. + error StakerAddressZero(); + /// @dev Thrown when provided `strategy` not found. + error StrategyNotFound(); + /// @dev Thrown when attempting to deposit to a non-whitelisted strategy. + error StrategyNotWhitelisted(); + /** * @notice Emitted when a new deposit occurs on behalf of `staker`. * @param staker Is the staker who is depositing funds into EigenLayer. @@ -22,9 +44,6 @@ interface IStrategyManager { */ event Deposit(address staker, IERC20 token, IStrategy strategy, uint256 shares); - /// @notice Emitted when `thirdPartyTransfersForbidden` is updated for a strategy and value by the owner - event UpdatedThirdPartyTransfersForbidden(IStrategy strategy, bool value); - /// @notice Emitted when the `strategyWhitelister` is changed event StrategyWhitelisterChanged(address previousAddress, address newAddress); @@ -64,7 +83,6 @@ interface IStrategyManager { * @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 @@ -78,51 +96,38 @@ interface IStrategyManager { bytes memory signature ) external returns (uint256 shares); - /// @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, uint256 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, uint256 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, uint256 shares, IERC20 token) external; - - /// @notice Returns the current shares of `user` in `strategy` - function stakerStrategyShares(address user, IStrategy strategy) external view returns (uint256 shares); - /** * @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, uint256[] memory); + function getDeposits( + address staker + ) external view returns (IStrategy[] memory, uint256[] memory); + + function getStakerStrategyList( + address staker + ) external view returns (IStrategy[] memory); /// @notice Simple getter function that returns `stakerStrategyList[staker].length`. - function stakerStrategyListLength(address staker) external view returns (uint256); + function stakerStrategyListLength( + address staker + ) external view returns (uint256); /** * @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 + IStrategy[] calldata strategiesToWhitelist ) external; /** * @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; + function removeStrategiesFromDepositWhitelist( + IStrategy[] calldata strategiesToRemoveFromWhitelist + ) external; /// @notice Returns the single, central Delegation contract of EigenLayer function delegation() external view returns (IDelegationManager); @@ -137,11 +142,7 @@ interface IStrategyManager { 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 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); + function strategyIsWhitelistedForDeposit( + IStrategy strategy + ) external view returns (bool); } diff --git a/src/contracts/interfaces/IWhitelister.sol b/src/contracts/interfaces/IWhitelister.sol index da68992c8..1afdce118 100644 --- a/src/contracts/interfaces/IWhitelister.sol +++ b/src/contracts/interfaces/IWhitelister.sol @@ -11,9 +11,13 @@ import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/utils/Create2.sol"; interface IWhitelister { - function whitelist(address operator) external; + function whitelist( + address operator + ) external; - function getStaker(address operator) external returns (address); + function getStaker( + address operator + ) external returns (address); function depositIntoStrategy( address staker, diff --git a/src/contracts/libraries/BeaconChainProofs.sol b/src/contracts/libraries/BeaconChainProofs.sol index 9d0caa8d9..7e176653b 100644 --- a/src/contracts/libraries/BeaconChainProofs.sol +++ b/src/contracts/libraries/BeaconChainProofs.sol @@ -10,6 +10,13 @@ import "../libraries/Endian.sol"; //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 library BeaconChainProofs { + /// @dev Thrown when a proof is invalid. + error InvalidProof(); + /// @dev Thrown when a proof with an invalid length is provided. + error InvalidProofLength(); + /// @dev Thrown when a validator fields length is invalid. + error InvalidValidatorFieldsLength(); + /// @notice Heights of various merkle trees in the beacon chain /// - beaconBlockRoot /// | HEIGHT: BEACON_BLOCK_HEADER_TREE_HEIGHT @@ -99,10 +106,7 @@ library BeaconChainProofs { /// @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 { - require( - proof.proof.length == 32 * (BEACON_BLOCK_HEADER_TREE_HEIGHT), - "BeaconChainProofs.verifyStateRoot: Proof has incorrect length" - ); + require(proof.proof.length == 32 * (BEACON_BLOCK_HEADER_TREE_HEIGHT), InvalidProofLength()); /// This merkle proof verifies the `beaconStateRoot` under the `beaconBlockRoot` /// - beaconBlockRoot @@ -115,7 +119,7 @@ library BeaconChainProofs { leaf: proof.beaconStateRoot, index: STATE_ROOT_INDEX }), - "BeaconChainProofs.verifyStateRoot: Invalid state root merkle proof" + InvalidProof() ); } @@ -135,16 +139,13 @@ library BeaconChainProofs { bytes calldata validatorFieldsProof, uint40 validatorIndex ) internal view { - require( - validatorFields.length == VALIDATOR_FIELDS_LENGTH, - "BeaconChainProofs.verifyValidatorFields: Validator fields has incorrect length" - ); + require(validatorFields.length == VALIDATOR_FIELDS_LENGTH, InvalidValidatorFieldsLength()); /// 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 require( validatorFieldsProof.length == 32 * ((VALIDATOR_TREE_HEIGHT + 1) + BEACON_STATE_TREE_HEIGHT), - "BeaconChainProofs.verifyValidatorFields: Proof has incorrect length" + InvalidProofLength() ); // Merkleize `validatorFields` to get the leaf to prove @@ -165,7 +166,7 @@ library BeaconChainProofs { leaf: validatorRoot, index: index }), - "BeaconChainProofs.verifyValidatorFields: Invalid merkle proof" + InvalidProof() ); } @@ -187,7 +188,7 @@ library BeaconChainProofs { function verifyBalanceContainer(bytes32 beaconBlockRoot, BalanceContainerProof calldata proof) internal view { require( proof.proof.length == 32 * (BEACON_BLOCK_HEADER_TREE_HEIGHT + BEACON_STATE_TREE_HEIGHT), - "BeaconChainProofs.verifyBalanceContainer: Proof has incorrect length" + InvalidProofLength() ); /// This proof combines two proofs, so its index accounts for the relative position of leaves in two trees: @@ -205,7 +206,7 @@ library BeaconChainProofs { leaf: proof.balanceContainerRoot, index: index }), - "BeaconChainProofs.verifyBalanceContainer: invalid balance container proof" + InvalidProof() ); } @@ -221,10 +222,7 @@ library BeaconChainProofs { ) internal view returns (uint64 validatorBalanceGwei) { /// 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 - require( - proof.proof.length == 32 * (BALANCE_TREE_HEIGHT + 1), - "BeaconChainProofs.verifyValidatorBalance: Proof has incorrect length" - ); + require(proof.proof.length == 32 * (BALANCE_TREE_HEIGHT + 1), InvalidProofLength()); /// 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` @@ -240,7 +238,7 @@ library BeaconChainProofs { leaf: proof.balanceRoot, index: balanceIndex }), - "BeaconChainProofs.verifyValidatorBalance: Invalid merkle proof" + InvalidProof() ); /// Extract the individual validator's balance from the `balanceRoot` @@ -274,32 +272,44 @@ library BeaconChainProofs { /// (See https://github.com/ethereum/consensus-specs/blob/dev/specs/phase0/beacon-chain.md#validator) /// @dev Retrieves a validator's pubkey hash - function getPubkeyHash(bytes32[] memory validatorFields) internal pure returns (bytes32) { + function getPubkeyHash( + bytes32[] memory validatorFields + ) internal pure returns (bytes32) { return validatorFields[VALIDATOR_PUBKEY_INDEX]; } /// @dev Retrieves a validator's withdrawal credentials - function getWithdrawalCredentials(bytes32[] memory validatorFields) internal pure returns (bytes32) { + function getWithdrawalCredentials( + bytes32[] memory validatorFields + ) internal pure returns (bytes32) { return validatorFields[VALIDATOR_WITHDRAWAL_CREDENTIALS_INDEX]; } /// @dev Retrieves a validator's effective balance (in gwei) - function getEffectiveBalanceGwei(bytes32[] memory validatorFields) internal pure returns (uint64) { + function getEffectiveBalanceGwei( + bytes32[] memory validatorFields + ) internal pure returns (uint64) { return Endian.fromLittleEndianUint64(validatorFields[VALIDATOR_BALANCE_INDEX]); } /// @dev Retrieves a validator's activation epoch - function getActivationEpoch(bytes32[] memory validatorFields) internal pure returns (uint64) { + function getActivationEpoch( + bytes32[] memory validatorFields + ) internal pure returns (uint64) { return Endian.fromLittleEndianUint64(validatorFields[VALIDATOR_ACTIVATION_EPOCH_INDEX]); } /// @dev Retrieves true IFF a validator is marked slashed - function isValidatorSlashed(bytes32[] memory validatorFields) internal pure returns (bool) { + function isValidatorSlashed( + bytes32[] memory validatorFields + ) internal pure returns (bool) { return validatorFields[VALIDATOR_SLASHED_INDEX] != 0; } /// @dev Retrieves a validator's exit epoch - function getExitEpoch(bytes32[] memory validatorFields) internal pure returns (uint64) { + function getExitEpoch( + bytes32[] memory validatorFields + ) internal pure returns (uint64) { return Endian.fromLittleEndianUint64(validatorFields[VALIDATOR_EXIT_EPOCH_INDEX]); } } diff --git a/src/contracts/libraries/BytesLib.sol b/src/contracts/libraries/BytesLib.sol index a019da303..b20ef5992 100644 --- a/src/contracts/libraries/BytesLib.sol +++ b/src/contracts/libraries/BytesLib.sol @@ -9,6 +9,9 @@ pragma solidity >=0.8.0 <0.9.0; library BytesLib { + error Overflow(); + error OutOfBounds(); + function concat(bytes memory _preBytes, bytes memory _postBytes) internal pure returns (bytes memory) { bytes memory tempBytes; @@ -211,8 +214,8 @@ library BytesLib { } function slice(bytes memory _bytes, uint256 _start, uint256 _length) internal pure returns (bytes memory) { - require(_length + 31 >= _length, "slice_overflow"); - require(_bytes.length >= _start + _length, "slice_outOfBounds"); + require(_length + 31 >= _length, Overflow()); + require(_bytes.length >= _start + _length, OutOfBounds()); bytes memory tempBytes; @@ -270,7 +273,7 @@ library BytesLib { } function toAddress(bytes memory _bytes, uint256 _start) internal pure returns (address) { - require(_bytes.length >= _start + 20, "toAddress_outOfBounds"); + require(_bytes.length >= _start + 20, OutOfBounds()); address tempAddress; assembly { @@ -281,7 +284,7 @@ library BytesLib { } function toUint8(bytes memory _bytes, uint256 _start) internal pure returns (uint8) { - require(_bytes.length >= _start + 1, "toUint8_outOfBounds"); + require(_bytes.length >= _start + 1, OutOfBounds()); uint8 tempUint; assembly { @@ -292,7 +295,7 @@ library BytesLib { } function toUint16(bytes memory _bytes, uint256 _start) internal pure returns (uint16) { - require(_bytes.length >= _start + 2, "toUint16_outOfBounds"); + require(_bytes.length >= _start + 2, OutOfBounds()); uint16 tempUint; assembly { @@ -303,7 +306,7 @@ library BytesLib { } function toUint32(bytes memory _bytes, uint256 _start) internal pure returns (uint32) { - require(_bytes.length >= _start + 4, "toUint32_outOfBounds"); + require(_bytes.length >= _start + 4, OutOfBounds()); uint32 tempUint; assembly { @@ -314,7 +317,7 @@ library BytesLib { } function toUint64(bytes memory _bytes, uint256 _start) internal pure returns (uint64) { - require(_bytes.length >= _start + 8, "toUint64_outOfBounds"); + require(_bytes.length >= _start + 8, OutOfBounds()); uint64 tempUint; assembly { @@ -325,7 +328,7 @@ library BytesLib { } function toUint96(bytes memory _bytes, uint256 _start) internal pure returns (uint96) { - require(_bytes.length >= _start + 12, "toUint96_outOfBounds"); + require(_bytes.length >= _start + 12, OutOfBounds()); uint96 tempUint; assembly { @@ -336,7 +339,7 @@ library BytesLib { } function toUint128(bytes memory _bytes, uint256 _start) internal pure returns (uint128) { - require(_bytes.length >= _start + 16, "toUint128_outOfBounds"); + require(_bytes.length >= _start + 16, OutOfBounds()); uint128 tempUint; assembly { @@ -347,7 +350,7 @@ library BytesLib { } function toUint256(bytes memory _bytes, uint256 _start) internal pure returns (uint256) { - require(_bytes.length >= _start + 32, "toUint256_outOfBounds"); + require(_bytes.length >= _start + 32, OutOfBounds()); uint256 tempUint; assembly { @@ -358,7 +361,7 @@ library BytesLib { } function toBytes32(bytes memory _bytes, uint256 _start) internal pure returns (bytes32) { - require(_bytes.length >= _start + 32, "toBytes32_outOfBounds"); + require(_bytes.length >= _start + 32, OutOfBounds()); bytes32 tempBytes32; assembly { diff --git a/src/contracts/libraries/EIP1271SignatureUtils.sol b/src/contracts/libraries/EIP1271SignatureUtils.sol index a4452f91e..4726e7d29 100644 --- a/src/contracts/libraries/EIP1271SignatureUtils.sol +++ b/src/contracts/libraries/EIP1271SignatureUtils.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.12; +pragma solidity ^0.8.27; import "@openzeppelin/contracts/interfaces/IERC1271.sol"; import "@openzeppelin/contracts/utils/Address.sol"; @@ -11,6 +11,9 @@ import "@openzeppelin/contracts/utils/cryptography/ECDSA.sol"; * @notice Terms of Service: https://docs.eigenlayer.xyz/overview/terms-of-service */ library EIP1271SignatureUtils { + error InvalidSignatureEIP1271(); + error InvalidSignatureSigner(); + // bytes4(keccak256("isValidSignature(bytes32,bytes)") bytes4 internal constant EIP1271_MAGICVALUE = 0x1626ba7e; @@ -29,13 +32,10 @@ library EIP1271SignatureUtils { if (Address.isContract(signer)) { require( IERC1271(signer).isValidSignature(digestHash, signature) == EIP1271_MAGICVALUE, - "EIP1271SignatureUtils.checkSignature_EIP1271: ERC1271 signature verification failed" + InvalidSignatureEIP1271() ); } else { - require( - ECDSA.recover(digestHash, signature) == signer, - "EIP1271SignatureUtils.checkSignature_EIP1271: signature not from signer" - ); + require(ECDSA.recover(digestHash, signature) == signer, InvalidSignatureSigner()); } } } diff --git a/src/contracts/libraries/Endian.sol b/src/contracts/libraries/Endian.sol index f9799bb9e..56233cda2 100644 --- a/src/contracts/libraries/Endian.sol +++ b/src/contracts/libraries/Endian.sol @@ -9,7 +9,9 @@ library Endian { * @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(bytes32 lenum) internal pure returns (uint64 n) { + function fromLittleEndianUint64( + bytes32 lenum + ) internal pure returns (uint64 n) { // the number needs to be stored in little-endian encoding (ie in bytes 0-8) n = uint64(uint256(lenum >> 192)); // forgefmt: disable-next-item diff --git a/src/contracts/libraries/Merkle.sol b/src/contracts/libraries/Merkle.sol index 5b7635423..660d1a4bf 100644 --- a/src/contracts/libraries/Merkle.sol +++ b/src/contracts/libraries/Merkle.sol @@ -140,7 +140,9 @@ library Merkle { * @return The computed Merkle root of the tree. * @dev A pre-condition to this function is that leaves.length is a power of two. If not, the function will merkleize the inputs incorrectly. */ - function merkleizeSha256(bytes32[] memory leaves) internal pure returns (bytes32) { + function merkleizeSha256( + bytes32[] memory leaves + ) internal pure returns (bytes32) { //there are half as many nodes in the layer above the leaves uint256 numNodesInLayer = leaves.length / 2; //create a layer to store the internal nodes @@ -163,4 +165,47 @@ library Merkle { //the first node in the layer is the root return layer[0]; } + + /** + * @notice this function returns the merkle root of a tree created from a set of leaves using keccak256 as its hash function + * @param leaves the leaves of the merkle tree + * @return The computed Merkle root of the tree. + * @dev This pads to the next power of 2. very inefficient! just for POC + */ + function merkleizeKeccak256( + bytes32[] memory leaves + ) internal pure returns (bytes32) { + uint256 paddedLength = 2; + while (paddedLength < leaves.length) { + paddedLength <<= 1; + } + + bytes32[] memory paddedLeaves = new bytes32[](paddedLength); + for (uint256 i = 0; i < leaves.length; i++) { + paddedLeaves[i] = leaves[i]; + } + leaves = paddedLeaves; + + //there are half as many nodes in the layer above the leaves + uint256 numNodesInLayer = leaves.length / 2; + //create a layer to store the internal nodes + bytes32[] memory layer = new bytes32[](numNodesInLayer); + //fill the layer with the pairwise hashes of the leaves + for (uint256 i = 0; i < numNodesInLayer; i++) { + layer[i] = keccak256(abi.encodePacked(leaves[2 * i], leaves[2 * i + 1])); + } + //the next layer above has half as many nodes + numNodesInLayer /= 2; + //while we haven't computed the root + while (numNodesInLayer != 0) { + //overwrite the first numNodesInLayer nodes in layer with the pairwise hashes of their children + for (uint256 i = 0; i < numNodesInLayer; i++) { + layer[i] = keccak256(abi.encodePacked(layer[2 * i], layer[2 * i + 1])); + } + //the next layer above has half as many nodes + numNodesInLayer /= 2; + } + //the first node in the layer is the root + return layer[0]; + } } diff --git a/src/contracts/libraries/SlashingLib.sol b/src/contracts/libraries/SlashingLib.sol new file mode 100644 index 000000000..783f01f11 --- /dev/null +++ b/src/contracts/libraries/SlashingLib.sol @@ -0,0 +1,95 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.27; + +import "@openzeppelin/contracts/utils/math/Math.sol"; + +/// @dev the stakerScalingFactor and totalMagnitude have initial default values to 1e18 as "1" +/// to preserve precision with uint256 math. We use `WAD` where these variables are used +/// and divide to represent as 1 +uint64 constant WAD = 1e18; + +/// @dev Delay before deallocations are completable and can be added back into freeMagnitude +/// This is also the same delay for withdrawals to be completable +uint32 constant DEALLOCATION_DELAY = 17.5 days; + +/* + * There are 3 types of shares: + * 1. 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 are comparable between operators and stakers. + * - These live in the storage of StrategyManager strategies: + * - `totalShares` is the total amount of shares delegated to a strategy + * 2. delegatedShares + * - These can be converted to shares given an operator and a strategy + * - by multiplying by the operator's totalMagnitude for the strategy + * - These values automatically update their conversion into tokens + * - when the operator's total magnitude for the strategy is decreased upon slashing + * - These live in the storage of the DelegationManager: + * - `delegatedShares` is the total amount of delegatedShares delegated to an operator for a strategy + * - `withdrawal.delegatedShares` is the amount of delegatedShares in a withdrawal + * 3. principalShares + * - These can be converted into delegatedShares given a staker and a strategy + * - by multiplying by the staker's depositScalingFactor for the strategy + * - These values automatically update their conversion into tokens + * - when the staker's depositScalingFactor for the strategy is increased upon new deposits + * - or when the staker's operator's total magnitude for the strategy is decreased upon slashing + * - These represent the total amount of shares the staker would have of a strategy if they were never slashed + * - These live in the storage of the StrategyManager/EigenPodManager + * - `stakerStrategyShares` in the SM is the staker's principalShares that have not been queued for withdrawal in a strategy + * - `podOwnerShares` in the EPM is the staker's principalShares that have not been queued for withdrawal in the beaconChainETHStrategy + */ + +type Shares is uint256; + +type DelegatedShares is uint256; + +type PrincipalShares is uint256; + +using SlashingLib for Shares global; +using SlashingLib for DelegatedShares global; +using SlashingLib for PrincipalShares global; + +library SlashingLib { + using Math for uint256; + using SlashingLib for uint256; + + function toPrincipalShares( + DelegatedShares delegatedShares, + uint256 depositScalingFactor + ) internal pure returns (PrincipalShares) { + if (depositScalingFactor == 0) { + depositScalingFactor = WAD; + } + return PrincipalShares.wrap(DelegatedShares.unwrap(delegatedShares).divWad(depositScalingFactor)); + } + + function toDelegatedShares( + PrincipalShares principalShares, + uint256 depositScalingFactor + ) internal pure returns (DelegatedShares) { + if (depositScalingFactor == 0) { + depositScalingFactor = WAD; + } + return DelegatedShares.wrap(PrincipalShares.unwrap(principalShares).mulWad(depositScalingFactor)); + } + + function toShares(DelegatedShares delegatedShares, uint256 magnitude) internal pure returns (Shares) { + return Shares.wrap(DelegatedShares.unwrap(delegatedShares).mulWad(magnitude)); + } + + function toDelegatedShares(Shares shares, uint256 magnitude) internal pure returns (DelegatedShares) { + return DelegatedShares.wrap(Shares.unwrap(shares).divWad(magnitude)); + } + + // WAD MATH + + function mulWad(uint256 a, uint256 b) internal pure returns (uint256) { + return a.mulDiv(b, WAD); + } + + function divWad(uint256 a, uint256 b) internal pure returns (uint256) { + return a.mulDiv(WAD, b); + } +} diff --git a/src/contracts/libraries/Snapshots.sol b/src/contracts/libraries/Snapshots.sol new file mode 100644 index 000000000..2938065bd --- /dev/null +++ b/src/contracts/libraries/Snapshots.sol @@ -0,0 +1,289 @@ +// SPDX-License-Identifier: MIT + +pragma solidity ^0.8.0; + +import "@openzeppelin-upgrades-v4.9.0/contracts/utils/math/MathUpgradeable.sol"; +import "@openzeppelin-upgrades-v4.9.0/contracts/utils/math/SafeCastUpgradeable.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 (timestamps, etc). + * Some additional functions have also been added for convenience. + * @dev This library defines the `History` 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.History` in your contract, and store a new + * snapshot for the current transaction block using the {push} function. + * + * _Available since v4.5._ + */ +library Snapshots { + struct History { + Snapshot[] _snapshots; + } + + struct Snapshot { + uint32 _key; + uint224 _value; + } + + /** + * @dev Pushes a (`key`, `value`) pair into a History so that it is stored as the snapshot. + * + * Returns previous value and new value. + */ + function push(History storage self, uint32 key, uint224 value) internal returns (uint224, uint224) { + return _insert(self._snapshots, key, value); + } + + /** + * @dev Returns the value in the first (oldest) snapshot with key greater or equal than the search key, or zero if there is none. + */ + function lowerLookup(History storage self, uint32 key) internal view returns (uint224) { + uint256 len = self._snapshots.length; + uint256 pos = _lowerBinaryLookup(self._snapshots, key, 0, len); + return pos == len ? 0 : _unsafeAccess(self._snapshots, pos)._value; + } + + /** + * @dev Returns the value in the last (most recent) snapshot with key lower or equal than the search key, or zero if there is none. + */ + function upperLookup(History storage self, uint32 key) internal view returns (uint224) { + uint256 len = self._snapshots.length; + uint256 pos = _upperBinaryLookup(self._snapshots, key, 0, len); + return pos == 0 ? 0 : _unsafeAccess(self._snapshots, pos - 1)._value; + } + + /** + * @dev Returns the value in the last (most recent) snapshot with key lower or equal than the search key, or zero if there is none. + * + * NOTE: This is a variant of {upperLookup} that is optimised to find "recent" snapshot (snapshots with high keys). + */ + function upperLookupRecent(History storage self, uint32 key) internal view returns (uint224) { + uint256 len = self._snapshots.length; + + uint256 low = 0; + uint256 high = len; + + if (len > 5) { + uint256 mid = len - MathUpgradeable.sqrt(len); + if (key < _unsafeAccess(self._snapshots, mid)._key) { + high = mid; + } else { + low = mid + 1; + } + } + + uint256 pos = _upperBinaryLookup(self._snapshots, key, low, high); + + return pos == 0 ? 0 : _unsafeAccess(self._snapshots, pos - 1)._value; + } + + /** + * @dev Returns the value in the most recent snapshot, or zero if there are no snapshots. + */ + function latest( + History storage self + ) internal view returns (uint224) { + uint256 pos = self._snapshots.length; + return pos == 0 ? 0 : _unsafeAccess(self._snapshots, pos - 1)._value; + } + + /** + * @dev Returns whether there is a snapshot in the structure (i.e. it is not empty), and if so the key and value + * in the most recent snapshot. + */ + function latestSnapshot( + History storage self + ) internal view returns (bool exists, uint32 _key, uint224 _value) { + uint256 pos = self._snapshots.length; + if (pos == 0) { + return (false, 0, 0); + } else { + Snapshot memory ckpt = _unsafeAccess(self._snapshots, pos - 1); + return (true, ckpt._key, ckpt._value); + } + } + + /** + * @dev Returns the number of snapshot. + */ + function length( + History storage self + ) internal view returns (uint256) { + return self._snapshots.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 returns (uint224, uint224) { + uint256 pos = self.length; + + if (pos > 0) { + // Copying to memory is important here. + Snapshot memory last = _unsafeAccess(self, pos - 1); + + // Snapshot keys must be non-decreasing. + require(last._key <= key, "Snapshot: decreasing keys"); + + // Update or push new snapshot + if (last._key == key) { + _unsafeAccess(self, pos - 1)._value = value; + } else { + self.push(Snapshot({_key: key, _value: value})); + } + return (last._value, value); + } else { + self.push(Snapshot({_key: key, _value: value})); + return (0, value); + } + } + + /** + * @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( + Snapshot[] storage self, + uint32 key, + uint256 low, + uint256 high + ) private view returns (uint256) { + while (low < high) { + uint256 mid = MathUpgradeable.average(low, high); + if (_unsafeAccess(self, mid)._key > key) { + high = mid; + } else { + low = mid + 1; + } + } + return high; + } + + /** + * @dev Return the index of the first (oldest) snapshot with key is greater 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 _lowerBinaryLookup( + Snapshot[] storage self, + uint32 key, + uint256 low, + uint256 high + ) private view returns (uint256) { + while (low < high) { + uint256 mid = MathUpgradeable.average(low, high); + if (_unsafeAccess(self, mid)._key < key) { + low = mid + 1; + } else { + high = mid; + } + } + return high; + } + + /** + * @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) { + assembly { + mstore(0, self.slot) + result.slot := add(keccak256(0, 0x20), pos) + } + } + + /** + * + * ADDITIONAL FUNCTIONS FROM EIGEN-LABS + * + */ + + /** + * @dev Returns the value in the last (most recent) snapshot with key lower or equal than the search key, or zero if there is none. + * This function is a linear search for keys that are close to the end of the array. + */ + function upperLookupLinear(History storage self, uint32 key) internal view returns (uint224) { + uint256 len = self._snapshots.length; + for (uint256 i = len; i > 0; --i) { + Snapshot storage current = _unsafeAccess(self._snapshots, i - 1); + if (current._key <= key) { + return current._value; + } + } + return 0; + } + + /** + * @dev Returns the value in the last (most recent) snapshot with key lower or equal than the search key, or zero if there is none. + * In addition, returns the position of the snapshot in the array. + * + * NOTE: That if value != 0 && pos == 0, then that means the value is the first snapshot and actually exists + * a snapshot DNE iff value == 0 && pos == 0 + */ + function upperLookupWithPos(History storage self, uint32 key) internal view returns (uint224, uint256) { + uint256 len = self._snapshots.length; + uint256 pos = _upperBinaryLookup(self._snapshots, key, 0, len); + return pos == 0 ? (0, 0) : (_unsafeAccess(self._snapshots, pos - 1)._value, pos - 1); + } + + /** + * @dev Returns the value in the last (most recent) snapshot with key lower or equal than the search key, or zero if there is none. + * In addition, returns the position of the snapshot in the array. + * + * NOTE: This is a variant of {upperLookup} that is optimised to find "recent" snapshot (snapshots with high keys). + * NOTE: That if value != 0 && pos == 0, then that means the value is the first snapshot and actually exists + * a snapshot DNE iff value == 0 && pos == 0 => value == 0 + */ + function upperLookupRecentWithPos( + History storage self, + uint32 key + ) internal view returns (uint224, uint256, uint256) { + uint256 len = self._snapshots.length; + + uint256 low = 0; + uint256 high = len; + + if (len > 5) { + uint256 mid = len - MathUpgradeable.sqrt(len); + if (key < _unsafeAccess(self._snapshots, mid)._key) { + high = mid; + } else { + low = mid + 1; + } + } + + uint256 pos = _upperBinaryLookup(self._snapshots, key, low, high); + + return pos == 0 ? (0, 0, len) : (_unsafeAccess(self._snapshots, pos - 1)._value, pos - 1, len); + } + + /// @notice WARNING: this function is only used because of the invariant property + /// that from the current key, all future snapshotted magnitude values are strictly > current value. + /// Use function with extreme care for other situations. + function decrementAtAndFutureSnapshots(History storage self, uint32 key, uint224 decrementValue) internal { + (uint224 value, uint256 pos, uint256 len) = upperLookupRecentWithPos(self, key); + + // if there is no snapshot, return + if (value == 0 && pos == 0) { + pos = type(uint256).max; + } + + while (pos < len) { + Snapshot storage current = _unsafeAccess(self._snapshots, pos); + + // reverts from underflow. Expected to never happen in our usage + current._value -= decrementValue; + + unchecked { + ++pos; + } + } + } +} diff --git a/src/contracts/libraries/StructuredLinkedList.sol b/src/contracts/libraries/StructuredLinkedList.sol index 29410656f..dc7a63450 100644 --- a/src/contracts/libraries/StructuredLinkedList.sol +++ b/src/contracts/libraries/StructuredLinkedList.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.12; +pragma solidity ^0.8.27; /** * @title StructuredLinkedList @@ -25,7 +25,9 @@ library StructuredLinkedList { * @param self stored linked list from contract * @return bool true if list exists, false otherwise */ - function listExists(List storage self) internal view returns (bool) { + function listExists( + List storage self + ) internal view returns (bool) { // if the head nodes previous or next pointers both point to itself, then there are no items in the list if (self.list[_HEAD][_PREV] != _HEAD || self.list[_HEAD][_NEXT] != _HEAD) { return true; @@ -57,7 +59,9 @@ library StructuredLinkedList { * @param self stored linked list from contract * @return uint256 */ - function sizeOf(List storage self) internal view returns (uint256) { + function sizeOf( + List storage self + ) internal view returns (uint256) { return self.size; } @@ -66,7 +70,9 @@ library StructuredLinkedList { * @param self stored linked list from contract * @return uint256 the head of the list */ - function getHead(List storage self) internal view returns (uint256) { + function getHead( + List storage self + ) internal view returns (uint256) { return self.list[_HEAD][_NEXT]; } @@ -186,7 +192,9 @@ library StructuredLinkedList { * @param self stored linked list from contract * @return uint256 the removed node */ - function popFront(List storage self) internal returns (uint256) { + function popFront( + List storage self + ) internal returns (uint256) { return _pop(self, _NEXT); } @@ -195,7 +203,9 @@ library StructuredLinkedList { * @param self stored linked list from contract * @return uint256 the removed node */ - function popBack(List storage self) internal returns (uint256) { + function popBack( + List storage self + ) internal returns (uint256) { return _pop(self, _PREV); } diff --git a/src/contracts/permissions/Pausable.sol b/src/contracts/permissions/Pausable.sol index 52883e888..99182c601 100644 --- a/src/contracts/permissions/Pausable.sol +++ b/src/contracts/permissions/Pausable.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.12; +pragma solidity ^0.8.27; import "../interfaces/IPausable.sol"; @@ -32,33 +32,32 @@ contract Pausable is IPausable { /// @notice modifier onlyPauser() { - require(pauserRegistry.isPauser(msg.sender), "msg.sender is not permissioned as pauser"); + require(pauserRegistry.isPauser(msg.sender), OnlyPauser()); _; } modifier onlyUnpauser() { - require(msg.sender == pauserRegistry.unpauser(), "msg.sender is not permissioned as unpauser"); + require(msg.sender == pauserRegistry.unpauser(), OnlyUnpauser()); _; } /// @notice Throws if the contract is paused, i.e. if any of the bits in `_paused` is flipped to 1. modifier whenNotPaused() { - require(_paused == 0, "Pausable: contract is paused"); + require(_paused == 0, CurrentlyPaused()); _; } /// @notice Throws if the `indexed`th bit of `_paused` is 1, i.e. if the `index`th pause switch is flipped. - modifier onlyWhenNotPaused(uint8 index) { - require(!paused(index), "Pausable: index is paused"); + modifier onlyWhenNotPaused( + uint8 index + ) { + require(!paused(index), CurrentlyPaused()); _; } /// @notice One-time function for setting the `pauserRegistry` and initializing the value of `_paused`. function _initializePauser(IPauserRegistry _pauserRegistry, uint256 initPausedStatus) internal { - require( - address(pauserRegistry) == address(0) && address(_pauserRegistry) != address(0), - "Pausable._initializePauser: _initializePauser() can only be called once" - ); + require(address(pauserRegistry) == address(0) && address(_pauserRegistry) != address(0), InputAddressZero()); _paused = initPausedStatus; emit Paused(msg.sender, initPausedStatus); _setPauserRegistry(_pauserRegistry); @@ -70,9 +69,11 @@ contract Pausable is IPausable { * @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(uint256 newPausedStatus) external onlyPauser { + function pause( + uint256 newPausedStatus + ) external onlyPauser { // verify that the `newPausedStatus` does not *unflip* any bits (i.e. doesn't unpause anything, all 1 bits remain) - require((_paused & newPausedStatus) == _paused, "Pausable.pause: invalid attempt to unpause functionality"); + require((_paused & newPausedStatus) == _paused, InvalidNewPausedStatus()); _paused = newPausedStatus; emit Paused(msg.sender, newPausedStatus); } @@ -91,11 +92,11 @@ contract Pausable is IPausable { * @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(uint256 newPausedStatus) external onlyUnpauser { + function unpause( + uint256 newPausedStatus + ) external onlyUnpauser { // verify that the `newPausedStatus` does not *flip* any bits (i.e. doesn't pause anything, all 0 bits remain) - require( - ((~_paused) & (~newPausedStatus)) == (~_paused), "Pausable.unpause: invalid attempt to pause functionality" - ); + require(((~_paused) & (~newPausedStatus)) == (~_paused), InvalidNewPausedStatus()); _paused = newPausedStatus; emit Unpaused(msg.sender, newPausedStatus); } @@ -106,22 +107,25 @@ contract Pausable is IPausable { } /// @notice Returns 'true' if the `indexed`th bit of `_paused` is 1, and 'false' otherwise - function paused(uint8 index) public view virtual returns (bool) { + function paused( + uint8 index + ) public view virtual returns (bool) { uint256 mask = 1 << index; return ((_paused & mask) == mask); } /// @notice Allows the unpauser to set a new pauser registry - function setPauserRegistry(IPauserRegistry newPauserRegistry) external onlyUnpauser { + function setPauserRegistry( + IPauserRegistry newPauserRegistry + ) external onlyUnpauser { _setPauserRegistry(newPauserRegistry); } /// internal function for setting pauser registry - function _setPauserRegistry(IPauserRegistry newPauserRegistry) internal { - require( - address(newPauserRegistry) != address(0), - "Pausable._setPauserRegistry: newPauserRegistry cannot be the zero address" - ); + function _setPauserRegistry( + IPauserRegistry newPauserRegistry + ) internal { + require(address(newPauserRegistry) != address(0), InputAddressZero()); emit PauserRegistrySet(pauserRegistry, newPauserRegistry); pauserRegistry = newPauserRegistry; } diff --git a/src/contracts/permissions/PauserRegistry.sol b/src/contracts/permissions/PauserRegistry.sol index 1058784ec..cc86944af 100644 --- a/src/contracts/permissions/PauserRegistry.sol +++ b/src/contracts/permissions/PauserRegistry.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.12; +pragma solidity ^0.8.27; import "../interfaces/IPauserRegistry.sol"; @@ -16,7 +16,7 @@ contract PauserRegistry is IPauserRegistry { address public unpauser; modifier onlyUnpauser() { - require(msg.sender == unpauser, "msg.sender is not permissioned as unpauser"); + require(msg.sender == unpauser, OnlyUnpauser()); _; } @@ -35,18 +35,22 @@ contract PauserRegistry is IPauserRegistry { } /// @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(address newUnpauser) external onlyUnpauser { + function setUnpauser( + address newUnpauser + ) external onlyUnpauser { _setUnpauser(newUnpauser); } function _setIsPauser(address pauser, bool canPause) internal { - require(pauser != address(0), "PauserRegistry._setPauser: zero address input"); + require(pauser != address(0), InputAddressZero()); isPauser[pauser] = canPause; emit PauserStatusChanged(pauser, canPause); } - function _setUnpauser(address newUnpauser) internal { - require(newUnpauser != address(0), "PauserRegistry._setUnpauser: zero address input"); + function _setUnpauser( + address newUnpauser + ) internal { + require(newUnpauser != address(0), InputAddressZero()); emit UnpauserChanged(unpauser, newUnpauser); unpauser = newUnpauser; } diff --git a/src/contracts/pods/EigenPod.sol b/src/contracts/pods/EigenPod.sol index d98ef59f3..a1040ca66 100644 --- a/src/contracts/pods/EigenPod.sol +++ b/src/contracts/pods/EigenPod.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.12; +pragma solidity ^0.8.27; import "@openzeppelin-upgrades/contracts/proxy/utils/Initializable.sol"; import "@openzeppelin-upgrades/contracts/security/ReentrancyGuardUpgradeable.sol"; @@ -61,22 +61,19 @@ contract EigenPod is Initializable, ReentrancyGuardUpgradeable, EigenPodPausingC /// @notice Callable only by the EigenPodManager modifier onlyEigenPodManager() { - require(msg.sender == address(eigenPodManager), "EigenPod.onlyEigenPodManager: not eigenPodManager"); + require(msg.sender == address(eigenPodManager), OnlyEigenPodManager()); _; } /// @notice Callable only by the pod's owner modifier onlyEigenPodOwner() { - require(msg.sender == podOwner, "EigenPod.onlyEigenPodOwner: not podOwner"); + require(msg.sender == podOwner, OnlyEigenPodOwner()); _; } /// @notice Callable only by the pod's owner or proof submitter modifier onlyOwnerOrProofSubmitter() { - require( - msg.sender == podOwner || msg.sender == proofSubmitter, - "EigenPod.onlyOwnerOrProofSubmitter: caller is not pod owner or proof submitter" - ); + require(msg.sender == podOwner || msg.sender == proofSubmitter, OnlyEigenPodOwnerOrProofSubmitter()); _; } @@ -85,11 +82,10 @@ contract EigenPod is Initializable, ReentrancyGuardUpgradeable, EigenPodPausingC * 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(uint8 index) { - require( - !IPausable(address(eigenPodManager)).paused(index), - "EigenPod.onlyWhenNotPaused: index is paused in EigenPodManager" - ); + modifier onlyWhenNotPaused( + uint8 index + ) { + require(!IPausable(address(eigenPodManager)).paused(index), CurrentlyPaused()); _; } @@ -106,8 +102,10 @@ contract EigenPod is Initializable, ReentrancyGuardUpgradeable, EigenPodPausingC } /// @notice Used to initialize the pointers to addresses crucial to the pod's functionality. Called on construction by the EigenPodManager. - function initialize(address _podOwner) external initializer { - require(_podOwner != address(0), "EigenPod.initialize: podOwner cannot be zero address"); + function initialize( + address _podOwner + ) external initializer { + require(_podOwner != address(0), InputAddressZero()); podOwner = _podOwner; } @@ -134,11 +132,9 @@ contract EigenPod is Initializable, ReentrancyGuardUpgradeable, EigenPodPausingC * @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 - onlyOwnerOrProofSubmitter - onlyWhenNotPaused(PAUSED_START_CHECKPOINT) - { + function startCheckpoint( + bool revertIfNoBalance + ) external onlyOwnerOrProofSubmitter onlyWhenNotPaused(PAUSED_START_CHECKPOINT) { _startCheckpoint(revertIfNoBalance); } @@ -157,10 +153,7 @@ contract EigenPod is Initializable, ReentrancyGuardUpgradeable, EigenPodPausingC BeaconChainProofs.BalanceProof[] calldata proofs ) external onlyWhenNotPaused(PAUSED_EIGENPODS_VERIFY_CHECKPOINT_PROOFS) { uint64 checkpointTimestamp = currentCheckpointTimestamp; - require( - checkpointTimestamp != 0, - "EigenPod.verifyCheckpointProofs: must have active checkpoint to perform checkpoint proof" - ); + require(checkpointTimestamp != 0, NoActiveCheckpoints()); Checkpoint memory checkpoint = _currentCheckpoint; @@ -241,16 +234,13 @@ contract EigenPod is Initializable, ReentrancyGuardUpgradeable, EigenPodPausingC require( (validatorIndices.length == validatorFieldsProofs.length) && (validatorFieldsProofs.length == validatorFields.length), - "EigenPod.verifyWithdrawalCredentials: validatorIndices and proofs must be same length" + InputArrayLengthMismatch() ); // Calling this method using a `beaconTimestamp` <= `currentCheckpointTimestamp` would allow // a newly-verified validator to be submitted to `verifyCheckpointProofs`, making progress // on an existing checkpoint. - require( - beaconTimestamp > currentCheckpointTimestamp, - "EigenPod.verifyWithdrawalCredentials: specified timestamp is too far in past" - ); + require(beaconTimestamp > currentCheckpointTimestamp, BeaconTimestampTooFarInPast()); // Verify passed-in `beaconStateRoot` against the beacon block root // forgefmt: disable-next-item @@ -329,19 +319,13 @@ contract EigenPod is Initializable, ReentrancyGuardUpgradeable, EigenPodPausingC // 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`). - require( - beaconTimestamp > validatorInfo.lastCheckpointedAt, - "EigenPod.verifyStaleBalance: proof is older than last checkpoint" - ); + require(beaconTimestamp > validatorInfo.lastCheckpointedAt, ProofOlderThanLastCheckpoint()); // Validator must be checkpoint-able - require(validatorInfo.status == VALIDATOR_STATUS.ACTIVE, "EigenPod.verifyStaleBalance: validator is not active"); + require(validatorInfo.status == VALIDATOR_STATUS.ACTIVE, ValidatorNotActive()); // Validator must be slashed on the beacon chain - require( - proof.validatorFields.isValidatorSlashed(), - "EigenPod.verifyStaleBalance: validator must be slashed to be marked stale" - ); + require(proof.validatorFields.isValidatorSlashed(), ValidatorNotSlashed()); // Verify passed-in `beaconStateRoot` against the beacon block root // forgefmt: disable-next-item @@ -368,10 +352,7 @@ contract EigenPod is Initializable, ReentrancyGuardUpgradeable, EigenPodPausingC uint256[] memory amountsToWithdraw, address recipient ) external onlyEigenPodOwner onlyWhenNotPaused(PAUSED_NON_PROOF_WITHDRAWALS) { - require( - tokenList.length == amountsToWithdraw.length, - "EigenPod.recoverTokens: tokenList and amountsToWithdraw must be same length" - ); + require(tokenList.length == amountsToWithdraw.length, InputArrayLengthMismatch()); for (uint256 i = 0; i < tokenList.length; i++) { tokenList[i].safeTransfer(recipient, amountsToWithdraw[i]); } @@ -384,7 +365,9 @@ contract EigenPod is Initializable, ReentrancyGuardUpgradeable, EigenPodPausingC /// 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 onlyEigenPodOwner { + function setProofSubmitter( + address newProofSubmitter + ) external onlyEigenPodOwner { emit ProofSubmitterUpdated(proofSubmitter, newProofSubmitter); proofSubmitter = newProofSubmitter; } @@ -396,7 +379,7 @@ contract EigenPod is Initializable, ReentrancyGuardUpgradeable, EigenPodPausingC bytes32 depositDataRoot ) external payable onlyEigenPodManager { // stake on ethpos - require(msg.value == 32 ether, "EigenPod.stake: must initially stake for any validator with 32 ether"); + require(msg.value == 32 ether, MsgValueNot32ETH()); ethPOS.deposit{value: 32 ether}(pubkey, _podWithdrawalCredentials(), signature, depositDataRoot); emit EigenPodStaked(pubkey); } @@ -409,14 +392,10 @@ contract EigenPod is Initializable, ReentrancyGuardUpgradeable, EigenPodPausingC * @dev Reverts if `amountWei` is not a whole Gwei amount */ function withdrawRestakedBeaconChainETH(address recipient, uint256 amountWei) external onlyEigenPodManager { - require( - amountWei % GWEI_TO_WEI == 0, - "EigenPod.withdrawRestakedBeaconChainETH: amountWei must be a whole Gwei amount" - ); + require(amountWei % GWEI_TO_WEI == 0, AmountMustBeMultipleOfGwei()); uint64 amountGwei = uint64(amountWei / GWEI_TO_WEI); require( - amountGwei <= withdrawableRestakedExecutionLayerGwei, - "EigenPod.withdrawRestakedBeaconChainETH: amountGwei exceeds withdrawableRestakedExecutionLayerGwei" + amountGwei <= withdrawableRestakedExecutionLayerGwei, AmountExceedsWithdrawableRestakedExecutionLayerGwei() ); withdrawableRestakedExecutionLayerGwei -= amountGwei; emit RestakedBeaconChainETHWithdrawn(recipient, amountWei); @@ -446,10 +425,7 @@ contract EigenPod is Initializable, ReentrancyGuardUpgradeable, EigenPodPausingC ValidatorInfo memory validatorInfo = _validatorPubkeyHashToInfo[pubkeyHash]; // Withdrawal credential proofs should only be processed for "INACTIVE" validators - require( - validatorInfo.status == VALIDATOR_STATUS.INACTIVE, - "EigenPod._verifyWithdrawalCredentials: validator must be inactive to prove withdrawal credentials" - ); + require(validatorInfo.status == VALIDATOR_STATUS.INACTIVE, ValidatorAlreadyActive()); // 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 @@ -465,8 +441,7 @@ contract EigenPod is Initializable, ReentrancyGuardUpgradeable, EigenPodPausingC // to temporarily decrease, then be restored later. This would effectively prevent these // shares from being slashable on EigenLayer for a short period of time. require( - validatorFields.getActivationEpoch() != BeaconChainProofs.FAR_FUTURE_EPOCH, - "EigenPod._verifyWithdrawalCredentials: validator must be in the process of activating" + validatorFields.getActivationEpoch() != BeaconChainProofs.FAR_FUTURE_EPOCH, ValidatorNoPendingActivation() ); // Validator should not already be in the process of exiting. This is an important property @@ -491,15 +466,12 @@ contract EigenPod is Initializable, ReentrancyGuardUpgradeable, EigenPodPausingC // 1 + MAX_SEED_LOOKAHEAD + MIN_VALIDATOR_WITHDRAWABILITY_DELAY == 261 epochs (8352 slots). // // (See https://eth2book.info/capella/part3/helper/mutators/#initiate_validator_exit) - require( - validatorFields.getExitEpoch() == BeaconChainProofs.FAR_FUTURE_EPOCH, - "EigenPod._verifyWithdrawalCredentials: validator must not be exiting" - ); + require(validatorFields.getExitEpoch() == BeaconChainProofs.FAR_FUTURE_EPOCH, ValidatorIsExiting()); // Ensure the validator's withdrawal credentials are pointed at this pod require( validatorFields.getWithdrawalCredentials() == bytes32(_podWithdrawalCredentials()), - "EigenPod._verifyWithdrawalCredentials: proof is not for this EigenPod" + WithdrawCredentialsNotForEigenPod() ); // Get the validator's effective balance. Note that this method uses effective balance, while @@ -593,21 +565,17 @@ contract EigenPod is Initializable, ReentrancyGuardUpgradeable, EigenPodPausingC * @param revertIfNoBalance If the available ETH balance for checkpointing is 0 and this is * true, this method will revert */ - function _startCheckpoint(bool revertIfNoBalance) internal { - require( - currentCheckpointTimestamp == 0, - "EigenPod._startCheckpoint: must finish previous checkpoint before starting another" - ); + function _startCheckpoint( + bool revertIfNoBalance + ) internal { + require(currentCheckpointTimestamp == 0, IncompletePreviousCheckpoint()); // 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` - require( - lastCheckpointTimestamp != uint64(block.timestamp), - "EigenPod._startCheckpoint: cannot checkpoint twice in one block" - ); + require(lastCheckpointTimestamp != uint64(block.timestamp), CannotCheckpointTwiceInSingleBlock()); // 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` @@ -622,7 +590,7 @@ contract EigenPod is Initializable, ReentrancyGuardUpgradeable, EigenPodPausingC // If the caller doesn't want a "0 balance" checkpoint, revert if (revertIfNoBalance && podBalanceGwei == 0) { - revert("EigenPod._startCheckpoint: no balance available to checkpoint"); + revert NoBalanceToCheckpoint(); } // Create checkpoint using the previous block's root for proofs, and the current @@ -651,7 +619,9 @@ contract EigenPod is Initializable, ReentrancyGuardUpgradeable, EigenPodPausingC * - `lastCheckpointTimestamp` is updated * - `_currentCheckpoint` and `currentCheckpointTimestamp` are deleted */ - function _updateCheckpoint(Checkpoint memory checkpoint) internal { + function _updateCheckpoint( + Checkpoint memory checkpoint + ) internal { if (checkpoint.proofsRemaining == 0) { int256 totalShareDeltaWei = (int128(uint128(checkpoint.podBalanceGwei)) + checkpoint.balanceDeltasGwei) * int256(GWEI_TO_WEI); @@ -678,8 +648,10 @@ contract EigenPod is Initializable, ReentrancyGuardUpgradeable, EigenPodPausingC } ///@notice Calculates the pubkey hash of a validator's pubkey as per SSZ spec - function _calculateValidatorPubkeyHash(bytes memory validatorPubkey) internal pure returns (bytes32) { - require(validatorPubkey.length == 48, "EigenPod._calculateValidatorPubkeyHash must be a 48-byte BLS public key"); + function _calculateValidatorPubkeyHash( + bytes memory validatorPubkey + ) internal pure returns (bytes32) { + require(validatorPubkey.length == 48, InvalidValidatorPubKeyLength()); return sha256(abi.encodePacked(validatorPubkey, bytes16(0))); } @@ -695,21 +667,29 @@ contract EigenPod is Initializable, ReentrancyGuardUpgradeable, EigenPodPausingC */ /// @notice Returns the validatorInfo for a given validatorPubkeyHash - function validatorPubkeyHashToInfo(bytes32 validatorPubkeyHash) external view returns (ValidatorInfo memory) { + function validatorPubkeyHashToInfo( + bytes32 validatorPubkeyHash + ) external view returns (ValidatorInfo memory) { return _validatorPubkeyHashToInfo[validatorPubkeyHash]; } /// @notice Returns the validatorInfo for a given validatorPubkey - function validatorPubkeyToInfo(bytes calldata validatorPubkey) external view returns (ValidatorInfo memory) { + function validatorPubkeyToInfo( + bytes calldata validatorPubkey + ) external view returns (ValidatorInfo memory) { return _validatorPubkeyHashToInfo[_calculateValidatorPubkeyHash(validatorPubkey)]; } - function validatorStatus(bytes32 pubkeyHash) external view returns (VALIDATOR_STATUS) { + function validatorStatus( + bytes32 pubkeyHash + ) external view returns (VALIDATOR_STATUS) { return _validatorPubkeyHashToInfo[pubkeyHash].status; } /// @notice Returns the validator status for a given validatorPubkey - function validatorStatus(bytes calldata validatorPubkey) external view returns (VALIDATOR_STATUS) { + function validatorStatus( + bytes calldata validatorPubkey + ) external view returns (VALIDATOR_STATUS) { bytes32 validatorPubkeyHash = _calculateValidatorPubkeyHash(validatorPubkey); return _validatorPubkeyHashToInfo[validatorPubkeyHash].status; } @@ -723,15 +703,14 @@ contract EigenPod is Initializable, ReentrancyGuardUpgradeable, EigenPodPausingC /// @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) public view returns (bytes32) { - require( - block.timestamp - timestamp < BEACON_ROOTS_HISTORY_BUFFER_LENGTH * 12, - "EigenPod.getParentBlockRoot: timestamp out of range" - ); + function getParentBlockRoot( + uint64 timestamp + ) public view returns (bytes32) { + require(block.timestamp - timestamp < BEACON_ROOTS_HISTORY_BUFFER_LENGTH * 12, TimestampOutOfRange()); (bool success, bytes memory result) = BEACON_ROOTS_ADDRESS.staticcall(abi.encode(timestamp)); - require(success && result.length > 0, "EigenPod.getParentBlockRoot: invalid block root returned"); + require(success && result.length > 0, InvalidBlockRoot()); return abi.decode(result, (bytes32)); } } diff --git a/src/contracts/pods/EigenPodManager.sol b/src/contracts/pods/EigenPodManager.sol index 300f36de0..9353101c8 100644 --- a/src/contracts/pods/EigenPodManager.sol +++ b/src/contracts/pods/EigenPodManager.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.12; +pragma solidity ^0.8.27; import "@openzeppelin/contracts/utils/Create2.sol"; import "@openzeppelin-upgrades/contracts/proxy/utils/Initializable.sol"; @@ -28,15 +28,15 @@ contract EigenPodManager is EigenPodManagerStorage, ReentrancyGuardUpgradeable { - modifier onlyEigenPod(address podOwner) { - require(address(ownerToPod[podOwner]) == msg.sender, "EigenPodManager.onlyEigenPod: not a pod"); + modifier onlyEigenPod( + address podOwner + ) { + require(address(ownerToPod[podOwner]) == msg.sender, OnlyEigenPod()); _; } modifier onlyDelegationManager() { - require( - msg.sender == address(delegationManager), "EigenPodManager.onlyDelegationManager: not the DelegationManager" - ); + require(msg.sender == address(delegationManager), OnlyDelegationManager()); _; } @@ -65,7 +65,7 @@ contract EigenPodManager is * @dev Returns EigenPod address */ function createPod() external onlyWhenNotPaused(PAUSED_NEW_EIGENPODS) returns (address) { - require(!hasPod(msg.sender), "EigenPodManager.createPod: Sender already has a pod"); + require(!hasPod(msg.sender), EigenPodAlreadyExists()); // deploy a pod if the sender doesn't have one already IEigenPod pod = _deployPod(); @@ -104,13 +104,8 @@ contract EigenPodManager is address podOwner, int256 sharesDelta ) external onlyEigenPod(podOwner) nonReentrant { - require( - podOwner != address(0), "EigenPodManager.recordBeaconChainETHBalanceUpdate: podOwner cannot be zero address" - ); - require( - sharesDelta % int256(GWEI_TO_WEI) == 0, - "EigenPodManager.recordBeaconChainETHBalanceUpdate: sharesDelta must be a whole Gwei amount" - ); + require(podOwner != address(0), InputAddressZero()); + require(sharesDelta % int256(GWEI_TO_WEI) == 0, SharesNotMultipleOfGwei()); int256 currentPodOwnerShares = podOwnerShares[podOwner]; int256 updatedPodOwnerShares = currentPodOwnerShares + sharesDelta; podOwnerShares[podOwner] = updatedPodOwnerShares; @@ -121,18 +116,22 @@ contract EigenPodManager is sharesAfter: updatedPodOwnerShares }); // skip making a call to the DelegationManager if there is no change in delegateable shares + // or if the currentPodShares < 0 and updatedPodShares is still < 0. Means no update required + // in delegated shares if (changeInDelegatableShares != 0) { if (changeInDelegatableShares < 0) { delegationManager.decreaseDelegatedShares({ staker: podOwner, strategy: beaconChainETHStrategy, - shares: uint256(-changeInDelegatableShares) + removedShares: uint256(-changeInDelegatableShares) }); } else { delegationManager.increaseDelegatedShares({ staker: podOwner, strategy: beaconChainETHStrategy, - shares: uint256(changeInDelegatableShares) + // existing shares from standpoint of the DelegationManager + existingPrincipalShares: currentPodOwnerShares < 0 ? 0 : uint256(currentPodOwnerShares), + addedShares: uint256(changeInDelegatableShares) }); } } @@ -149,43 +148,46 @@ contract EigenPodManager is * @dev Reverts if `shares` is not a whole Gwei amount * @dev The delegation manager validates that the podOwner is not address(0) */ - function removeShares(address podOwner, uint256 shares) external onlyDelegationManager { - require(int256(shares) >= 0, "EigenPodManager.removeShares: shares cannot be negative"); - require(shares % GWEI_TO_WEI == 0, "EigenPodManager.removeShares: shares must be a whole Gwei amount"); - int256 updatedPodOwnerShares = podOwnerShares[podOwner] - int256(shares); - require( - updatedPodOwnerShares >= 0, - "EigenPodManager.removeShares: cannot result in pod owner having negative shares" - ); - podOwnerShares[podOwner] = updatedPodOwnerShares; + function removeShares(address staker, IStrategy strategy, uint256 shares) external onlyDelegationManager { + require(strategy == beaconChainETHStrategy, InvalidStrategy()); + require(int256(shares) >= 0, SharesNegative()); + require(shares % GWEI_TO_WEI == 0, SharesNotMultipleOfGwei()); + int256 updatedShares = podOwnerShares[staker] - int256(shares); + require(updatedShares >= 0, SharesNegative()); + podOwnerShares[staker] = updatedShares; - emit NewTotalShares(podOwner, updatedPodOwnerShares); + emit NewTotalShares(staker, updatedShares); } /** * @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) + * in the event that the podOwner has an existing shares deficit (i.e. `podOwnerShares[podOwner]` starts below zero). + * Also returns existingPodShares prior to adding shares, this is returned as 0 if the existing podOwnerShares is negative * @dev Reverts if `shares` is not a whole Gwei amount */ - function addShares(address podOwner, uint256 shares) external onlyDelegationManager returns (uint256) { - require(podOwner != address(0), "EigenPodManager.addShares: podOwner cannot be zero address"); - require(int256(shares) >= 0, "EigenPodManager.addShares: shares cannot be negative"); - require(shares % GWEI_TO_WEI == 0, "EigenPodManager.addShares: shares must be a whole Gwei amount"); - int256 currentPodOwnerShares = podOwnerShares[podOwner]; - int256 updatedPodOwnerShares = currentPodOwnerShares + int256(shares); - podOwnerShares[podOwner] = updatedPodOwnerShares; + function addShares( + address staker, + IERC20 token, + IStrategy strategy, + uint256 shares + ) external onlyDelegationManager { + require(strategy == beaconChainETHStrategy, InvalidStrategy()); + require(staker != address(0), InputAddressZero()); + require(int256(shares) >= 0, SharesNegative()); + require(shares % GWEI_TO_WEI == 0, SharesNotMultipleOfGwei()); + int256 currentShares = podOwnerShares[staker]; + int256 updatedShares = currentShares + int256(shares); + podOwnerShares[staker] = updatedShares; - emit PodSharesUpdated(podOwner, int256(shares)); - emit NewTotalShares(podOwner, updatedPodOwnerShares); + emit PodSharesUpdated(staker, int256(shares)); + emit NewTotalShares(staker, updatedShares); - return uint256( - _calculateChangeInDelegatableShares({ - sharesBefore: currentPodOwnerShares, - sharesAfter: updatedPodOwnerShares - }) - ); + uint256 increaseInDelegateableShares = + uint256(_calculateChangeInDelegatableShares({sharesBefore: currentShares, sharesAfter: updatedShares})); + + // TODO: ADD SHARES BACK TO DM } /** @@ -196,37 +198,46 @@ contract EigenPodManager is * we do not need to update the podOwnerShares if `currentPodOwnerShares` is positive */ function withdrawSharesAsTokens( - address podOwner, - address destination, - uint256 shares + address recipient, + IStrategy strategy, + uint256 shares, + IERC20 ) external onlyDelegationManager { - require(podOwner != address(0), "EigenPodManager.withdrawSharesAsTokens: podOwner cannot be zero address"); - require(destination != address(0), "EigenPodManager.withdrawSharesAsTokens: destination cannot be zero address"); - require(int256(shares) >= 0, "EigenPodManager.withdrawSharesAsTokens: shares cannot be negative"); - require(shares % GWEI_TO_WEI == 0, "EigenPodManager.withdrawSharesAsTokens: shares must be a whole Gwei amount"); - int256 currentPodOwnerShares = podOwnerShares[podOwner]; + require(strategy == beaconChainETHStrategy, InvalidStrategy()); + require(recipient != address(0), InputAddressZero()); + require(int256(shares) >= 0, SharesNegative()); + require(shares % GWEI_TO_WEI == 0, SharesNotMultipleOfGwei()); + int256 currentShares = podOwnerShares[recipient]; // if there is an existing shares deficit, prioritize decreasing the deficit first - if (currentPodOwnerShares < 0) { - uint256 currentShareDeficit = uint256(-currentPodOwnerShares); + if (currentShares < 0) { + uint256 currentShareDeficit = uint256(-currentShares); if (shares > currentShareDeficit) { // get rid of the whole deficit if possible, and pass any remaining shares onto destination - podOwnerShares[podOwner] = 0; + podOwnerShares[recipient] = 0; shares -= currentShareDeficit; - emit PodSharesUpdated(podOwner, int256(currentShareDeficit)); - emit NewTotalShares(podOwner, 0); + emit PodSharesUpdated(recipient, int256(currentShareDeficit)); + emit NewTotalShares(recipient, 0); } else { // otherwise get rid of as much deficit as possible, and return early, since there is nothing left over to forward on - int256 updatedPodOwnerShares = podOwnerShares[podOwner] + int256(shares); - podOwnerShares[podOwner] = updatedPodOwnerShares; - emit PodSharesUpdated(podOwner, int256(shares)); - emit NewTotalShares(podOwner, updatedPodOwnerShares); + int256 updatedShares = podOwnerShares[recipient] + int256(shares); + podOwnerShares[recipient] = updatedShares; + emit PodSharesUpdated(recipient, int256(shares)); + emit NewTotalShares(recipient, updatedShares); return; } } // Actually withdraw to the destination - ownerToPod[podOwner].withdrawRestakedBeaconChainETH(destination, shares); + ownerToPod[recipient].withdrawRestakedBeaconChainETH(recipient, shares); + } + + /// @notice Returns the current shares of `user` in `strategy` + /// @dev strategy must be beaconChainETH when talking to the EigenPodManager + /// @dev returns 0 if the user has negative shares + function stakerStrategyShares(address user, IStrategy strategy) public view returns (uint256 shares) { + require(strategy == beaconChainETHStrategy, InvalidStrategy()); + return podOwnerShares[user] < 0 ? 0 : uint256(podOwnerShares[user]); } // INTERNAL FUNCTIONS @@ -279,7 +290,9 @@ contract EigenPodManager is // VIEW FUNCTIONS /// @notice Returns the address of the `podOwner`'s EigenPod (whether it is deployed yet or not). - function getPod(address podOwner) public view returns (IEigenPod) { + function getPod( + address podOwner + ) public view returns (IEigenPod) { IEigenPod pod = ownerToPod[podOwner]; // if pod does not exist already, calculate what its address *will be* once it is deployed if (address(pod) == address(0)) { @@ -294,7 +307,9 @@ contract EigenPodManager is } /// @notice Returns 'true' if the `podOwner` has created an EigenPod, and 'false' otherwise. - function hasPod(address podOwner) public view returns (bool) { + function hasPod( + address podOwner + ) public view returns (bool) { return address(ownerToPod[podOwner]) != address(0); } } diff --git a/src/contracts/pods/EigenPodManagerStorage.sol b/src/contracts/pods/EigenPodManagerStorage.sol index d85c0a178..76b140846 100644 --- a/src/contracts/pods/EigenPodManagerStorage.sol +++ b/src/contracts/pods/EigenPodManagerStorage.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.12; +pragma solidity ^0.8.27; import "@openzeppelin/contracts/proxy/beacon/IBeacon.sol"; diff --git a/src/contracts/pods/EigenPodPausingConstants.sol b/src/contracts/pods/EigenPodPausingConstants.sol index e731747a6..509fcade1 100644 --- a/src/contracts/pods/EigenPodPausingConstants.sol +++ b/src/contracts/pods/EigenPodPausingConstants.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.12; +pragma solidity ^0.8.27; /** * @title Constants shared between 'EigenPod' and 'EigenPodManager' contracts. diff --git a/src/contracts/pods/EigenPodStorage.sol b/src/contracts/pods/EigenPodStorage.sol index 43bd494b8..096bf539c 100644 --- a/src/contracts/pods/EigenPodStorage.sol +++ b/src/contracts/pods/EigenPodStorage.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.12; +pragma solidity ^0.8.27; import "../interfaces/IEigenPod.sol"; diff --git a/src/contracts/strategies/EigenStrategy.sol b/src/contracts/strategies/EigenStrategy.sol index aa5204dcb..6fed7b313 100644 --- a/src/contracts/strategies/EigenStrategy.sol +++ b/src/contracts/strategies/EigenStrategy.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.12; +pragma solidity ^0.8.27; // NOTE: Mainnet uses the OpenZeppelin v4.9.0 contracts, but this imports the 4.7.1 version. This will be changed after an upgrade. import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; @@ -35,7 +35,9 @@ contract EigenStrategy is StrategyBase { IEigen public EIGEN; /// @notice Since this contract is designed to be initializable, the constructor simply sets `strategyManager`, the only immutable variable. - constructor(IStrategyManager _strategyManager) StrategyBase(_strategyManager) {} + constructor( + IStrategyManager _strategyManager + ) StrategyBase(_strategyManager) {} function initialize(IEigen _EIGEN, IERC20 _bEIGEN, IPauserRegistry _pauserRegistry) public virtual initializer { EIGEN = _EIGEN; @@ -51,7 +53,7 @@ contract EigenStrategy is StrategyBase { * @param amount deposit amount */ function _beforeDeposit(IERC20 token, uint256 amount) internal virtual override { - require(token == underlyingToken || token == EIGEN, "EigenStrategy.deposit: Can only deposit bEIGEN or EIGEN"); + require(token == underlyingToken || token == EIGEN, OnlyUnderlyingToken()); if (token == EIGEN) { // unwrap EIGEN into bEIGEN assuming a 1-1 unwrapping amount @@ -71,7 +73,7 @@ contract EigenStrategy is StrategyBase { IERC20 token, uint256 /*amountShares*/ ) internal virtual override { - require(token == underlyingToken || token == EIGEN, "EigenStrategy.withdraw: Can only withdraw bEIGEN or EIGEN"); + require(token == underlyingToken || token == EIGEN, OnlyUnderlyingToken()); } /** diff --git a/src/contracts/strategies/StrategyBase.sol b/src/contracts/strategies/StrategyBase.sol index a4fab630a..c907daa7a 100644 --- a/src/contracts/strategies/StrategyBase.sol +++ b/src/contracts/strategies/StrategyBase.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.12; +pragma solidity ^0.8.27; import "../interfaces/IStrategyManager.sol"; import "../permissions/Pausable.sol"; @@ -64,12 +64,14 @@ contract StrategyBase is Initializable, Pausable, IStrategy { /// @notice Simply checks that the `msg.sender` is the `strategyManager`, which is an address stored immutably at construction. modifier onlyStrategyManager() { - require(msg.sender == address(strategyManager), "StrategyBase.onlyStrategyManager"); + require(msg.sender == address(strategyManager), OnlyStrategyManager()); _; } /// @notice Since this contract is designed to be initializable, the constructor simply sets `strategyManager`, the only immutable variable. - constructor(IStrategyManager _strategyManager) { + constructor( + IStrategyManager _strategyManager + ) { strategyManager = _strategyManager; _disableInitializers(); } @@ -123,12 +125,12 @@ contract StrategyBase is Initializable, Pausable, IStrategy { newShares = (amount * virtualShareAmount) / virtualPriorTokenBalance; // extra check for correctness / against edge case where share rate can be massively inflated as a 'griefing' sort of attack - require(newShares != 0, "StrategyBase.deposit: newShares cannot be zero"); + require(newShares != 0, NewSharesZero()); // update total share amount to account for deposit totalShares = (priorTotalShares + newShares); - require(totalShares <= MAX_TOTAL_SHARES, "StrategyBase.deposit: totalShares exceeds `MAX_TOTAL_SHARES`"); + require(totalShares <= MAX_TOTAL_SHARES, TotalSharesExceedsMax()); // emit exchange rate _emitExchangeRate(virtualTokenBalance, totalShares + SHARES_OFFSET); @@ -156,10 +158,7 @@ contract StrategyBase is Initializable, Pausable, IStrategy { // copy `totalShares` value to memory, prior to any change uint256 priorTotalShares = totalShares; - require( - amountShares <= priorTotalShares, - "StrategyBase.withdraw: amountShares must be less than or equal to totalShares" - ); + require(amountShares <= priorTotalShares, WithdrawalAmountExceedsDeposit()); /** * @notice calculation of amountToSend *mirrors* `sharesToUnderlying(amountShares)`, but is different since the `totalShares` has already @@ -186,7 +185,7 @@ contract StrategyBase is Initializable, Pausable, IStrategy { * @param amount The amount of `token` being deposited */ function _beforeDeposit(IERC20 token, uint256 amount) internal virtual { - require(token == underlyingToken, "StrategyBase.deposit: Can only deposit underlyingToken"); + require(token == underlyingToken, OnlyUnderlyingToken()); } /** @@ -196,7 +195,7 @@ contract StrategyBase is Initializable, Pausable, IStrategy { * @param amountShares The amount of shares being withdrawn */ function _beforeWithdrawal(address recipient, IERC20 token, uint256 amountShares) internal virtual { - require(token == underlyingToken, "StrategyBase.withdraw: Can only withdraw the strategy token"); + require(token == underlyingToken, OnlyUnderlyingToken()); } /** @@ -225,7 +224,9 @@ contract StrategyBase is Initializable, Pausable, IStrategy { * @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(uint256 amountShares) public view virtual override returns (uint256) { + function sharesToUnderlyingView( + uint256 amountShares + ) public view virtual override returns (uint256) { // account for virtual shares and balance uint256 virtualTotalShares = totalShares + SHARES_OFFSET; uint256 virtualTokenBalance = _tokenBalance() + BALANCE_OFFSET; @@ -240,7 +241,9 @@ contract StrategyBase is Initializable, Pausable, IStrategy { * @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(uint256 amountShares) public view virtual override returns (uint256) { + function sharesToUnderlying( + uint256 amountShares + ) public view virtual override returns (uint256) { return sharesToUnderlyingView(amountShares); } @@ -251,7 +254,9 @@ contract StrategyBase is Initializable, Pausable, IStrategy { * @return The amount of shares corresponding to the input `amountUnderlying` * @dev Implementation for these functions in particular may vary significantly for different strategies */ - function underlyingToSharesView(uint256 amountUnderlying) public view virtual returns (uint256) { + function underlyingToSharesView( + uint256 amountUnderlying + ) public view virtual returns (uint256) { // account for virtual shares and balance uint256 virtualTotalShares = totalShares + SHARES_OFFSET; uint256 virtualTokenBalance = _tokenBalance() + BALANCE_OFFSET; @@ -266,7 +271,9 @@ contract StrategyBase is Initializable, Pausable, IStrategy { * @return The amount of shares corresponding to the input `amountUnderlying` * @dev Implementation for these functions in particular may vary significantly for different strategies */ - function underlyingToShares(uint256 amountUnderlying) external view virtual returns (uint256) { + function underlyingToShares( + uint256 amountUnderlying + ) external view virtual returns (uint256) { return underlyingToSharesView(amountUnderlying); } @@ -274,7 +281,9 @@ contract StrategyBase is Initializable, Pausable, IStrategy { * @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(address user) external view virtual returns (uint256) { + function userUnderlyingView( + address user + ) external view virtual returns (uint256) { return sharesToUnderlyingView(shares(user)); } @@ -282,7 +291,9 @@ contract StrategyBase is Initializable, Pausable, IStrategy { * @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(address user) external virtual returns (uint256) { + function userUnderlying( + address user + ) external virtual returns (uint256) { return sharesToUnderlying(shares(user)); } @@ -290,7 +301,9 @@ contract StrategyBase is Initializable, Pausable, IStrategy { * @notice convenience function for fetching the current total shares of `user` in this strategy, by * querying the `strategyManager` contract */ - function shares(address user) public view virtual returns (uint256) { + function shares( + address user + ) public view virtual returns (uint256) { return strategyManager.stakerStrategyShares(user, IStrategy(address(this))); } diff --git a/src/contracts/strategies/StrategyBaseTVLLimits.sol b/src/contracts/strategies/StrategyBaseTVLLimits.sol index 63b76ff45..33520b3db 100644 --- a/src/contracts/strategies/StrategyBaseTVLLimits.sol +++ b/src/contracts/strategies/StrategyBaseTVLLimits.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.12; +pragma solidity ^0.8.27; import "./StrategyBase.sol"; @@ -24,7 +24,9 @@ contract StrategyBaseTVLLimits is StrategyBase { event MaxTotalDepositsUpdated(uint256 previousValue, uint256 newValue); // solhint-disable-next-line no-empty-blocks - constructor(IStrategyManager _strategyManager) StrategyBase(_strategyManager) {} + constructor( + IStrategyManager _strategyManager + ) StrategyBase(_strategyManager) {} function initialize( uint256 _maxPerDeposit, @@ -56,10 +58,7 @@ contract StrategyBaseTVLLimits is StrategyBase { function _setTVLLimits(uint256 newMaxPerDeposit, uint256 newMaxTotalDeposits) internal { emit MaxPerDepositUpdated(maxPerDeposit, newMaxPerDeposit); emit MaxTotalDepositsUpdated(maxTotalDeposits, newMaxTotalDeposits); - require( - newMaxPerDeposit <= newMaxTotalDeposits, - "StrategyBaseTVLLimits._setTVLLimits: maxPerDeposit exceeds maxTotalDeposits" - ); + require(newMaxPerDeposit <= newMaxTotalDeposits, MaxPerDepositExceedsMax()); maxPerDeposit = newMaxPerDeposit; maxTotalDeposits = newMaxTotalDeposits; } @@ -77,8 +76,8 @@ contract StrategyBaseTVLLimits is StrategyBase { * @param amount The amount of `token` being deposited */ function _beforeDeposit(IERC20 token, uint256 amount) internal virtual override { - require(amount <= maxPerDeposit, "StrategyBaseTVLLimits: max per deposit exceeded"); - require(_tokenBalance() <= maxTotalDeposits, "StrategyBaseTVLLimits: max deposits exceeded"); + require(amount <= maxPerDeposit, MaxPerDepositExceedsMax()); + require(_tokenBalance() <= maxTotalDeposits, BalanceExceedsMaxTotalDeposits()); super._beforeDeposit(token, amount); } diff --git a/src/contracts/strategies/StrategyFactory.sol b/src/contracts/strategies/StrategyFactory.sol index 7e9a468fb..62e39aac2 100644 --- a/src/contracts/strategies/StrategyFactory.sol +++ b/src/contracts/strategies/StrategyFactory.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.12; +pragma solidity ^0.8.27; import "@openzeppelin/contracts/proxy/beacon/BeaconProxy.sol"; import "@openzeppelin-upgrades/contracts/access/OwnableUpgradeable.sol"; @@ -21,7 +21,9 @@ contract StrategyFactory is StrategyFactoryStorage, OwnableUpgradeable, Pausable IStrategyManager public immutable strategyManager; /// @notice Since this contract is designed to be initializable, the constructor simply sets the immutable variables. - constructor(IStrategyManager _strategyManager) { + constructor( + IStrategyManager _strategyManager + ) { strategyManager = _strategyManager; _disableInitializers(); } @@ -43,16 +45,11 @@ contract StrategyFactory is StrategyFactoryStorage, OwnableUpgradeable, Pausable * $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) - { - require(!isBlacklisted[token], "StrategyFactory.deployNewStrategy: Token is blacklisted"); - require( - deployedStrategies[token] == IStrategy(address(0)), - "StrategyFactory.deployNewStrategy: Strategy already exists for token" - ); + function deployNewStrategy( + IERC20 token + ) external onlyWhenNotPaused(PAUSED_NEW_STRATEGIES) returns (IStrategy newStrategy) { + require(!isBlacklisted[token], BlacklistedToken()); + require(deployedStrategies[token] == IStrategy(address(0)), StrategyAlreadyExists()); IStrategy strategy = IStrategy( address( new BeaconProxy( @@ -63,10 +60,8 @@ contract StrategyFactory is StrategyFactoryStorage, OwnableUpgradeable, Pausable ); _setStrategyForToken(token, strategy); IStrategy[] memory strategiesToWhitelist = new IStrategy[](1); - bool[] memory thirdPartyTransfersForbiddenValues = new bool[](1); strategiesToWhitelist[0] = strategy; - thirdPartyTransfersForbiddenValues[0] = false; - strategyManager.addStrategiesToDepositWhitelist(strategiesToWhitelist, thirdPartyTransfersForbiddenValues); + strategyManager.addStrategiesToDepositWhitelist(strategiesToWhitelist); return strategy; } @@ -74,12 +69,14 @@ contract StrategyFactory is StrategyFactoryStorage, OwnableUpgradeable, Pausable * @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 { + function blacklistTokens( + IERC20[] calldata tokens + ) external onlyOwner { IStrategy[] memory strategiesToRemove = new IStrategy[](tokens.length); uint256 removeIdx = 0; for (uint256 i; i < tokens.length; ++i) { - require(!isBlacklisted[tokens[i]], "StrategyFactory.blacklistTokens: Cannot blacklist deployed strategy"); + require(!isBlacklisted[tokens[i]], CannotBlacklistDeployedStrategy()); isBlacklisted[tokens[i]] = true; emit TokenBlacklisted(tokens[i]); @@ -107,23 +104,17 @@ contract StrategyFactory is StrategyFactoryStorage, OwnableUpgradeable, Pausable * @notice Owner-only function to pass through a call to `StrategyManager.addStrategiesToDepositWhitelist` */ function whitelistStrategies( - IStrategy[] calldata strategiesToWhitelist, - bool[] calldata thirdPartyTransfersForbiddenValues + IStrategy[] calldata strategiesToWhitelist ) external onlyOwner { - strategyManager.addStrategiesToDepositWhitelist(strategiesToWhitelist, thirdPartyTransfersForbiddenValues); - } - - /** - * @notice Owner-only function to pass through a call to `StrategyManager.setThirdPartyTransfersForbidden` - */ - function setThirdPartyTransfersForbidden(IStrategy strategy, bool value) external onlyOwner { - strategyManager.setThirdPartyTransfersForbidden(strategy, value); + strategyManager.addStrategiesToDepositWhitelist(strategiesToWhitelist); } /** * @notice Owner-only function to pass through a call to `StrategyManager.removeStrategiesFromDepositWhitelist` */ - function removeStrategiesFromWhitelist(IStrategy[] calldata strategiesToRemoveFromWhitelist) external onlyOwner { + function removeStrategiesFromWhitelist( + IStrategy[] calldata strategiesToRemoveFromWhitelist + ) external onlyOwner { strategyManager.removeStrategiesFromDepositWhitelist(strategiesToRemoveFromWhitelist); } @@ -132,7 +123,9 @@ contract StrategyFactory is StrategyFactoryStorage, OwnableUpgradeable, Pausable emit StrategySetForToken(token, strategy); } - function _setStrategyBeacon(IBeacon _strategyBeacon) internal { + function _setStrategyBeacon( + IBeacon _strategyBeacon + ) internal { emit StrategyBeaconModified(strategyBeacon, _strategyBeacon); strategyBeacon = _strategyBeacon; } diff --git a/src/contracts/strategies/StrategyFactoryStorage.sol b/src/contracts/strategies/StrategyFactoryStorage.sol index f2eff77ca..c74cf7eb2 100644 --- a/src/contracts/strategies/StrategyFactoryStorage.sol +++ b/src/contracts/strategies/StrategyFactoryStorage.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.12; +pragma solidity ^0.8.27; import "../interfaces/IStrategyFactory.sol"; diff --git a/src/contracts/token/BackingEigen.sol b/src/contracts/token/BackingEigen.sol index 0a3b707ec..6cbe5db45 100644 --- a/src/contracts/token/BackingEigen.sol +++ b/src/contracts/token/BackingEigen.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.12; +pragma solidity ^0.8.27; import "@openzeppelin-v4.9.0/contracts/token/ERC20/IERC20.sol"; import "@openzeppelin-upgrades-v4.9.0/contracts/token/ERC20/extensions/ERC20VotesUpgradeable.sol"; @@ -27,7 +27,9 @@ contract BackingEigen is OwnableUpgradeable, ERC20VotesUpgradeable { /// @notice event emitted when the EIGEN token is backed event Backed(); - constructor(IERC20 _EIGEN) { + constructor( + IERC20 _EIGEN + ) { EIGEN = _EIGEN; _disableInitializers(); } @@ -35,7 +37,9 @@ contract BackingEigen is OwnableUpgradeable, ERC20VotesUpgradeable { /** * @notice An initializer function that sets initial values for the contract's state variables. */ - function initialize(address initialOwner) public initializer { + function initialize( + address initialOwner + ) public initializer { __Ownable_init(); __ERC20_init("Backing Eigen", "bEIGEN"); _transferOwnership(initialOwner); diff --git a/src/contracts/token/Eigen.sol b/src/contracts/token/Eigen.sol index 327fe13b4..c385608bf 100644 --- a/src/contracts/token/Eigen.sol +++ b/src/contracts/token/Eigen.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.12; +pragma solidity ^0.8.27; import "@openzeppelin-v4.9.0/contracts/token/ERC20/IERC20.sol"; import "@openzeppelin-upgrades-v4.9.0/contracts/token/ERC20/extensions/ERC20VotesUpgradeable.sol"; @@ -32,7 +32,9 @@ contract Eigen is OwnableUpgradeable, ERC20VotesUpgradeable { /// @notice event emitted when the transfer restrictions disabled event TransferRestrictionsDisabled(); - constructor(IERC20 _bEIGEN) { + constructor( + IERC20 _bEIGEN + ) { bEIGEN = _bEIGEN; _disableInitializers(); } @@ -121,7 +123,9 @@ contract Eigen is OwnableUpgradeable, ERC20VotesUpgradeable { /** * @notice This function allows bEIGEN holders to wrap their tokens into Eigen */ - function wrap(uint256 amount) external { + function wrap( + uint256 amount + ) external { require(bEIGEN.transferFrom(msg.sender, address(this), amount), "Eigen.wrap: bEIGEN transfer failed"); _transfer(address(this), msg.sender, amount); } @@ -129,7 +133,9 @@ contract Eigen is OwnableUpgradeable, ERC20VotesUpgradeable { /** * @notice This function allows Eigen holders to unwrap their tokens into bEIGEN */ - function unwrap(uint256 amount) external { + function unwrap( + uint256 amount + ) external { _transfer(msg.sender, address(this), amount); require(bEIGEN.transfer(msg.sender, amount), "Eigen.unwrap: bEIGEN transfer failed"); } diff --git a/src/contracts/utils/UpgradeableSignatureCheckingUtils.sol b/src/contracts/utils/UpgradeableSignatureCheckingUtils.sol index ae6251361..562ccd495 100644 --- a/src/contracts/utils/UpgradeableSignatureCheckingUtils.sol +++ b/src/contracts/utils/UpgradeableSignatureCheckingUtils.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.12; +pragma solidity ^0.8.27; import "@openzeppelin-upgrades/contracts/proxy/utils/Initializable.sol"; diff --git a/src/test/Delegation.t.sol b/src/test/Delegation.t.sol index 3138039cd..3628d281c 100644 --- a/src/test/Delegation.t.sol +++ b/src/test/Delegation.t.sol @@ -1,501 +1,501 @@ // SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.12; - -import "@openzeppelin/contracts/mocks/ERC1271WalletMock.sol"; -import "src/contracts/interfaces/ISignatureUtils.sol"; - -import "../test/EigenLayerTestHelper.t.sol"; - -contract DelegationTests is EigenLayerTestHelper { - uint256 public PRIVATE_KEY = 420; - - uint32 serveUntil = 100; - - address public registryCoordinator = address(uint160(uint256(keccak256("registryCoordinator")))); - uint8 defaultQuorumNumber = 0; - bytes32 defaultOperatorId = bytes32(uint256(0)); - - modifier fuzzedAmounts(uint256 ethAmount, uint256 eigenAmount) { - cheats.assume(ethAmount >= 0 && ethAmount <= 1e18); - cheats.assume(eigenAmount >= 0 && eigenAmount <= 1e18); - _; - } - - function setUp() public virtual override { - EigenLayerDeployer.setUp(); - } - - /// @notice testing if an operator can register to themselves. - function testSelfOperatorRegister() public { - _testRegisterAdditionalOperator(0); - } - - /// @notice testing if an operator can delegate to themselves. - /// @param sender is the address of the operator. - function testSelfOperatorDelegate(address sender) public { - cheats.assume(sender != address(0)); - cheats.assume(sender != address(eigenLayerProxyAdmin)); - IDelegationManager.OperatorDetails memory operatorDetails = IDelegationManager.OperatorDetails({ - __deprecated_earningsReceiver: sender, - delegationApprover: address(0), - stakerOptOutWindowBlocks: 0 - }); - _testRegisterAsOperator(sender, operatorDetails); - } - - function testTwoSelfOperatorsRegister() public { - _testRegisterAdditionalOperator(0); - _testRegisterAdditionalOperator(1); - } - - /// @notice registers a fixed address as a delegate, delegates to it from a second address, - /// and checks that the delegate's voteWeights increase properly - /// @param operator is the operator being delegated to. - /// @param staker is the staker delegating stake to the operator. - function testDelegation( - address operator, - address staker, - uint96 ethAmount, - uint96 eigenAmount - ) public fuzzedAddress(operator) fuzzedAddress(staker) fuzzedAmounts(ethAmount, eigenAmount) { - cheats.assume(staker != operator); - // base strategy will revert if these amounts are too small on first deposit - cheats.assume(ethAmount >= 1); - cheats.assume(eigenAmount >= 2); - - // Set weights ahead of the helper function call - bytes memory quorumNumbers = new bytes(2); - quorumNumbers[0] = bytes1(uint8(0)); - quorumNumbers[0] = bytes1(uint8(1)); - _testDelegation(operator, staker, ethAmount, eigenAmount); - } - - /// @notice tests that a when an operator is delegated to, that delegation is properly accounted for. - function testDelegationReceived( - address _operator, - address staker, - uint64 ethAmount, - uint64 eigenAmount - ) public fuzzedAddress(_operator) fuzzedAddress(staker) fuzzedAmounts(ethAmount, eigenAmount) { - cheats.assume(staker != _operator); - cheats.assume(ethAmount >= 1); - cheats.assume(eigenAmount >= 2); - - // use storage to solve stack-too-deep - operator = _operator; - - IDelegationManager.OperatorDetails memory operatorDetails = IDelegationManager.OperatorDetails({ - __deprecated_earningsReceiver: operator, - delegationApprover: address(0), - stakerOptOutWindowBlocks: 0 - }); - if (!delegation.isOperator(operator)) { - _testRegisterAsOperator(operator, operatorDetails); - } - - uint256 amountBefore = delegation.operatorShares(operator, wethStrat); - - //making additional deposits to the strategies - assertTrue(!delegation.isDelegated(staker) == true, "testDelegation: staker is not delegate"); - _testDepositWeth(staker, ethAmount); - _testDepositEigen(staker, eigenAmount); - _testDelegateToOperator(staker, operator); - assertTrue(delegation.isDelegated(staker) == true, "testDelegation: staker is not delegate"); - - (/*IStrategy[] memory updatedStrategies*/, uint256[] memory updatedShares) = strategyManager.getDeposits(staker); - - { - IStrategy _strat = wethStrat; - // IStrategy _strat = strategyManager.stakerStrats(staker, 0); - assertTrue(address(_strat) != address(0), "stakerStrats not updated correctly"); - - assertTrue( - delegation.operatorShares(operator, _strat) - updatedShares[0] == amountBefore, - "ETH operatorShares not updated correctly" - ); - - cheats.startPrank(address(strategyManager)); - - IDelegationManager.OperatorDetails memory expectedOperatorDetails = delegation.operatorDetails(operator); - assertTrue( - keccak256(abi.encode(expectedOperatorDetails)) == keccak256(abi.encode(operatorDetails)), - "failed to set correct operator details" - ); - } - } - - /// @notice tests that a when an operator is undelegated from, that the staker is properly classified as undelegated. - function testUndelegation( - address operator, - address staker, - uint96 ethAmount, - uint96 eigenAmount - ) public fuzzedAddress(operator) fuzzedAddress(staker) fuzzedAmounts(ethAmount, eigenAmount) { - cheats.assume(staker != operator); - // base strategy will revert if these amounts are too small on first deposit - cheats.assume(ethAmount >= 1); - cheats.assume(eigenAmount >= 1); - _testDelegation(operator, staker, ethAmount, eigenAmount); - - (IStrategy[] memory strategyArray, uint256[] memory shareAmounts) = strategyManager.getDeposits(staker); - uint256[] memory strategyIndexes = new uint256[](strategyArray.length); - - // withdraw shares - _testQueueWithdrawal(staker, strategyIndexes, strategyArray, shareAmounts, staker /*withdrawer*/); - - cheats.startPrank(staker); - delegation.undelegate(staker); - cheats.stopPrank(); - - require(delegation.delegatedTo(staker) == address(0), "undelegation unsuccessful"); - } - - /// @notice tests delegation from a staker to operator via ECDSA signature. - function testDelegateToBySignature( - address operator, - uint96 ethAmount, - uint96 eigenAmount, - uint256 expiry - ) public fuzzedAddress(operator) { - address staker = cheats.addr(PRIVATE_KEY); - _registerOperatorAndDepositFromStaker(operator, staker, ethAmount, eigenAmount); - - uint256 nonceBefore = delegation.stakerNonce(staker); - - bytes32 structHash = keccak256( - abi.encode(delegation.STAKER_DELEGATION_TYPEHASH(), staker, operator, nonceBefore, expiry) - ); - bytes32 digestHash = keccak256(abi.encodePacked("\x19\x01", delegation.domainSeparator(), structHash)); - - bytes memory signature; - { - (uint8 v, bytes32 r, bytes32 s) = cheats.sign(PRIVATE_KEY, digestHash); - signature = abi.encodePacked(r, s, v); - } - - if (expiry < block.timestamp) { - cheats.expectRevert("DelegationManager.delegateToBySignature: staker signature expired"); - } - ISignatureUtils.SignatureWithExpiry memory signatureWithExpiry = ISignatureUtils.SignatureWithExpiry({ - signature: signature, - expiry: expiry - }); - delegation.delegateToBySignature(staker, operator, signatureWithExpiry, signatureWithExpiry, bytes32(0)); - if (expiry >= block.timestamp) { - assertTrue(delegation.isDelegated(staker) == true, "testDelegation: staker is not delegate"); - assertTrue(nonceBefore + 1 == delegation.stakerNonce(staker), "nonce not incremented correctly"); - assertTrue(delegation.delegatedTo(staker) == operator, "staker delegated to wrong operator"); - } - } - - /// @notice tries delegating using a signature and an EIP 1271 compliant wallet - function testDelegateToBySignature_WithContractWallet_Successfully( - address operator, - uint96 ethAmount, - uint96 eigenAmount - ) public fuzzedAddress(operator) { - address staker = cheats.addr(PRIVATE_KEY); - - // deploy ERC1271WalletMock for staker to use - cheats.startPrank(staker); - ERC1271WalletMock wallet = new ERC1271WalletMock(staker); - cheats.stopPrank(); - staker = address(wallet); - - _registerOperatorAndDepositFromStaker(operator, staker, ethAmount, eigenAmount); - - uint256 nonceBefore = delegation.stakerNonce(staker); - - bytes32 structHash = keccak256( - abi.encode(delegation.STAKER_DELEGATION_TYPEHASH(), staker, operator, nonceBefore, type(uint256).max) - ); - bytes32 digestHash = keccak256(abi.encodePacked("\x19\x01", delegation.domainSeparator(), structHash)); - - bytes memory signature; - { - (uint8 v, bytes32 r, bytes32 s) = cheats.sign(PRIVATE_KEY, digestHash); - signature = abi.encodePacked(r, s, v); - } - - ISignatureUtils.SignatureWithExpiry memory signatureWithExpiry = ISignatureUtils.SignatureWithExpiry({ - signature: signature, - expiry: type(uint256).max - }); - delegation.delegateToBySignature(staker, operator, signatureWithExpiry, signatureWithExpiry, bytes32(0)); - assertTrue(delegation.isDelegated(staker) == true, "testDelegation: staker is not delegate"); - assertTrue(nonceBefore + 1 == delegation.stakerNonce(staker), "nonce not incremented correctly"); - assertTrue(delegation.delegatedTo(staker) == operator, "staker delegated to wrong operator"); - } - - /// @notice tries delegating using a signature and an EIP 1271 compliant wallet, *but* providing a bad signature - function testDelegateToBySignature_WithContractWallet_BadSignature( - address operator, - uint96 ethAmount, - uint96 eigenAmount - ) public fuzzedAddress(operator) { - address staker = cheats.addr(PRIVATE_KEY); - - // deploy ERC1271WalletMock for staker to use - cheats.startPrank(staker); - ERC1271WalletMock wallet = new ERC1271WalletMock(staker); - cheats.stopPrank(); - staker = address(wallet); - - _registerOperatorAndDepositFromStaker(operator, staker, ethAmount, eigenAmount); - - uint256 nonceBefore = delegation.stakerNonce(staker); - - bytes32 structHash = keccak256( - abi.encode(delegation.STAKER_DELEGATION_TYPEHASH(), staker, operator, nonceBefore, type(uint256).max) - ); - bytes32 digestHash = keccak256(abi.encodePacked("\x19\x01", delegation.domainSeparator(), structHash)); - - bytes memory signature; - { - (uint8 v, bytes32 r, bytes32 s) = cheats.sign(PRIVATE_KEY, digestHash); - // mess up the signature by flipping v's parity - v = (v == 27 ? 28 : 27); - signature = abi.encodePacked(r, s, v); - } - - cheats.expectRevert( - bytes("EIP1271SignatureUtils.checkSignature_EIP1271: ERC1271 signature verification failed") - ); - ISignatureUtils.SignatureWithExpiry memory signatureWithExpiry = ISignatureUtils.SignatureWithExpiry({ - signature: signature, - expiry: type(uint256).max - }); - delegation.delegateToBySignature(staker, operator, signatureWithExpiry, signatureWithExpiry, bytes32(0)); - } - - /// @notice tries delegating using a wallet that does not comply with EIP 1271 - function testDelegateToBySignature_WithContractWallet_NonconformingWallet( - address operator, - uint96 ethAmount, - uint96 eigenAmount, - uint8 v, - bytes32 r, - bytes32 s - ) public fuzzedAddress(operator) { - address staker = cheats.addr(PRIVATE_KEY); - - // deploy non ERC1271-compliant wallet for staker to use - cheats.startPrank(staker); - ERC1271MaliciousMock wallet = new ERC1271MaliciousMock(); - cheats.stopPrank(); - staker = address(wallet); - - _registerOperatorAndDepositFromStaker(operator, staker, ethAmount, eigenAmount); - - cheats.assume(staker != operator); - - bytes memory signature = abi.encodePacked(r, s, v); - - cheats.expectRevert(); - ISignatureUtils.SignatureWithExpiry memory signatureWithExpiry = ISignatureUtils.SignatureWithExpiry({ - signature: signature, - expiry: type(uint256).max - }); - delegation.delegateToBySignature(staker, operator, signatureWithExpiry, signatureWithExpiry, bytes32(0)); - } - - /// @notice tests delegation to EigenLayer via an ECDSA signatures with invalid signature - /// @param operator is the operator being delegated to. - function testDelegateToByInvalidSignature( - address operator, - uint96 ethAmount, - uint96 eigenAmount, - uint8 v, - bytes32 r, - bytes32 s - ) public fuzzedAddress(operator) fuzzedAmounts(ethAmount, eigenAmount) { - address staker = cheats.addr(PRIVATE_KEY); - _registerOperatorAndDepositFromStaker(operator, staker, ethAmount, eigenAmount); - - bytes memory signature = abi.encodePacked(r, s, v); - - cheats.expectRevert(); - ISignatureUtils.SignatureWithExpiry memory signatureWithExpiry = ISignatureUtils.SignatureWithExpiry({ - signature: signature, - expiry: type(uint256).max - }); - delegation.delegateToBySignature(staker, operator, signatureWithExpiry, signatureWithExpiry, bytes32(0)); - } - - /// @notice This function tests to ensure that a delegation contract - /// cannot be intitialized multiple times - function testCannotInitMultipleTimesDelegation() public cannotReinit { - //delegation has already been initialized in the Deployer test contract - delegation.initialize( - address(this), - eigenLayerPauserReg, - 0, - minWithdrawalDelayBlocks, - initializeStrategiesToSetDelayBlocks, - initializeWithdrawalDelayBlocks - ); - } - - /// @notice This function tests to ensure that a you can't register as a delegate multiple times - /// @param operator is the operator being delegated to. - function testRegisterAsOperatorMultipleTimes(address operator) public fuzzedAddress(operator) { - IDelegationManager.OperatorDetails memory operatorDetails = IDelegationManager.OperatorDetails({ - __deprecated_earningsReceiver: operator, - delegationApprover: address(0), - stakerOptOutWindowBlocks: 0 - }); - _testRegisterAsOperator(operator, operatorDetails); - cheats.expectRevert(bytes("DelegationManager.registerAsOperator: caller is already actively delegated")); - _testRegisterAsOperator(operator, operatorDetails); - } - - /// @notice This function tests to ensure that a staker cannot delegate to an unregistered operator - /// @param delegate is the unregistered operator - function testDelegationToUnregisteredDelegate(address delegate) public fuzzedAddress(delegate) { - //deposit into 1 strategy for getOperatorAddress(1), who is delegating to the unregistered operator - _testDepositStrategies(getOperatorAddress(1), 1e18, 1); - _testDepositEigen(getOperatorAddress(1), 1e18); - - cheats.expectRevert(bytes("DelegationManager.delegateTo: operator is not registered in EigenLayer")); - cheats.startPrank(getOperatorAddress(1)); - ISignatureUtils.SignatureWithExpiry memory signatureWithExpiry; - delegation.delegateTo(delegate, signatureWithExpiry, bytes32(0)); - cheats.stopPrank(); - } - - /// @notice This function tests to ensure that a delegation contract - /// cannot be intitialized multiple times, test with different caller addresses - function testCannotInitMultipleTimesDelegation(address _attacker) public { - cheats.assume(_attacker != address(eigenLayerProxyAdmin)); - //delegation has already been initialized in the Deployer test contract - vm.prank(_attacker); - cheats.expectRevert(bytes("Initializable: contract is already initialized")); - delegation.initialize( - _attacker, - eigenLayerPauserReg, - 0, - 0, // minWithdrawalDelayBLocks - initializeStrategiesToSetDelayBlocks, - initializeWithdrawalDelayBlocks - ); - } - - /// @notice This function tests to ensure that an address can only call registerAsOperator() once - function testCannotRegisterAsOperatorTwice( - address _operator, - address _dt - ) public fuzzedAddress(_operator) fuzzedAddress(_dt) { - vm.assume(_dt != address(0)); - vm.startPrank(_operator); - IDelegationManager.OperatorDetails memory operatorDetails = IDelegationManager.OperatorDetails({ - __deprecated_earningsReceiver: msg.sender, - delegationApprover: address(0), - stakerOptOutWindowBlocks: 0 - }); - string memory emptyStringForMetadataURI; - delegation.registerAsOperator(operatorDetails, emptyStringForMetadataURI); - vm.expectRevert("DelegationManager.registerAsOperator: caller is already actively delegated"); - delegation.registerAsOperator(operatorDetails, emptyStringForMetadataURI); - cheats.stopPrank(); - } - - /// @notice this function checks that you can only delegate to an address that is already registered. - function testDelegateToInvalidOperator( - address _staker, - address _unregisteredoperator - ) public fuzzedAddress(_staker) { - vm.startPrank(_staker); - cheats.expectRevert(bytes("DelegationManager.delegateTo: operator is not registered in EigenLayer")); - ISignatureUtils.SignatureWithExpiry memory signatureWithExpiry; - delegation.delegateTo(_unregisteredoperator, signatureWithExpiry, bytes32(0)); - cheats.expectRevert(bytes("DelegationManager.delegateTo: operator is not registered in EigenLayer")); - delegation.delegateTo(_staker, signatureWithExpiry, bytes32(0)); - cheats.stopPrank(); - } - - function testUndelegate_SigP_Version(address _operator, address _staker, address _dt) public { - vm.assume(_operator != address(0)); - vm.assume(_staker != address(0)); - vm.assume(_operator != _staker); - vm.assume(_dt != address(0)); - vm.assume(_operator != address(eigenLayerProxyAdmin)); - vm.assume(_staker != address(eigenLayerProxyAdmin)); - - // setup delegation - vm.prank(_operator); - IDelegationManager.OperatorDetails memory operatorDetails = IDelegationManager.OperatorDetails({ - __deprecated_earningsReceiver: _dt, - delegationApprover: address(0), - stakerOptOutWindowBlocks: 0 - }); - string memory emptyStringForMetadataURI; - delegation.registerAsOperator(operatorDetails, emptyStringForMetadataURI); - vm.prank(_staker); - ISignatureUtils.SignatureWithExpiry memory signatureWithExpiry; - delegation.delegateTo(_operator, signatureWithExpiry, bytes32(0)); - - // operators cannot undelegate from themselves - vm.prank(_operator); - cheats.expectRevert(bytes("DelegationManager.undelegate: operators cannot be undelegated")); - delegation.undelegate(_operator); - - // assert still delegated - assertTrue(delegation.isDelegated(_staker)); - assertTrue(delegation.isOperator(_operator)); - - // _staker *can* undelegate themselves - vm.prank(_staker); - delegation.undelegate(_staker); - - // assert undelegated - assertTrue(!delegation.isDelegated(_staker)); - assertTrue(delegation.isOperator(_operator)); - } - - function _testRegisterAdditionalOperator(uint256 index) internal { - address sender = getOperatorAddress(index); - - //register as both ETH and EIGEN operator - uint256 wethToDeposit = 1e18; - uint256 eigenToDeposit = 1e10; - _testDepositWeth(sender, wethToDeposit); - _testDepositEigen(sender, eigenToDeposit); - IDelegationManager.OperatorDetails memory operatorDetails = IDelegationManager.OperatorDetails({ - __deprecated_earningsReceiver: sender, - delegationApprover: address(0), - stakerOptOutWindowBlocks: 0 - }); - _testRegisterAsOperator(sender, operatorDetails); - cheats.startPrank(sender); - - cheats.stopPrank(); - } - - // registers the operator if they are not already registered, and deposits "WETH" + "EIGEN" on behalf of the staker. - function _registerOperatorAndDepositFromStaker( - address operator, - address staker, - uint96 ethAmount, - uint96 eigenAmount - ) internal { - cheats.assume(staker != operator); - - // if first deposit amount to base strategy is too small, it will revert. ignore that case here. - cheats.assume(ethAmount >= 1 && ethAmount <= 1e18); - cheats.assume(eigenAmount >= 1 && eigenAmount <= 1e18); - - if (!delegation.isOperator(operator)) { - IDelegationManager.OperatorDetails memory operatorDetails = IDelegationManager.OperatorDetails({ - __deprecated_earningsReceiver: operator, - delegationApprover: address(0), - stakerOptOutWindowBlocks: 0 - }); - _testRegisterAsOperator(operator, operatorDetails); - } - - //making additional deposits to the strategies - assertTrue(!delegation.isDelegated(staker) == true, "testDelegation: staker is not delegate"); - _testDepositWeth(staker, ethAmount); - _testDepositEigen(staker, eigenAmount); - } -} +pragma solidity ^0.8.27; + +// import "@openzeppelin/contracts/mocks/ERC1271WalletMock.sol"; +// import "src/contracts/interfaces/ISignatureUtils.sol"; + +// import "../test/EigenLayerTestHelper.t.sol"; + +// contract DelegationTests is EigenLayerTestHelper { +// uint256 public PRIVATE_KEY = 420; + +// uint32 serveUntil = 100; + +// address public registryCoordinator = address(uint160(uint256(keccak256("registryCoordinator")))); +// uint8 defaultQuorumNumber = 0; +// bytes32 defaultOperatorId = bytes32(uint256(0)); + +// modifier fuzzedAmounts(uint256 ethAmount, uint256 eigenAmount) { +// cheats.assume(ethAmount >= 0 && ethAmount <= 1e18); +// cheats.assume(eigenAmount >= 0 && eigenAmount <= 1e18); +// _; +// } + +// function setUp() public virtual override { +// EigenLayerDeployer.setUp(); +// } + +// /// @notice testing if an operator can register to themselves. +// function testSelfOperatorRegister() public { +// _testRegisterAdditionalOperator(0); +// } + +// /// @notice testing if an operator can delegate to themselves. +// /// @param sender is the address of the operator. +// function testSelfOperatorDelegate(address sender) public { +// cheats.assume(sender != address(0)); +// cheats.assume(sender != address(eigenLayerProxyAdmin)); +// IDelegationManager.OperatorDetails memory operatorDetails = IDelegationManager.OperatorDetails({ +// __deprecated_earningsReceiver: sender, +// delegationApprover: address(0), +// stakerOptOutWindowBlocks: 0 +// }); +// _testRegisterAsOperator(sender, operatorDetails); +// } + +// function testTwoSelfOperatorsRegister() public { +// _testRegisterAdditionalOperator(0); +// _testRegisterAdditionalOperator(1); +// } + +// /// @notice registers a fixed address as a delegate, delegates to it from a second address, +// /// and checks that the delegate's voteWeights increase properly +// /// @param operator is the operator being delegated to. +// /// @param staker is the staker delegating stake to the operator. +// function testDelegation( +// address operator, +// address staker, +// uint96 ethAmount, +// uint96 eigenAmount +// ) public fuzzedAddress(operator) fuzzedAddress(staker) fuzzedAmounts(ethAmount, eigenAmount) { +// cheats.assume(staker != operator); +// // base strategy will revert if these amounts are too small on first deposit +// cheats.assume(ethAmount >= 1); +// cheats.assume(eigenAmount >= 2); + +// // Set weights ahead of the helper function call +// bytes memory quorumNumbers = new bytes(2); +// quorumNumbers[0] = bytes1(uint8(0)); +// quorumNumbers[0] = bytes1(uint8(1)); +// _testDelegation(operator, staker, ethAmount, eigenAmount); +// } + +// /// @notice tests that a when an operator is delegated to, that delegation is properly accounted for. +// function testDelegationReceived( +// address _operator, +// address staker, +// uint64 ethAmount, +// uint64 eigenAmount +// ) public fuzzedAddress(_operator) fuzzedAddress(staker) fuzzedAmounts(ethAmount, eigenAmount) { +// cheats.assume(staker != _operator); +// cheats.assume(ethAmount >= 1); +// cheats.assume(eigenAmount >= 2); + +// // use storage to solve stack-too-deep +// operator = _operator; + +// IDelegationManager.OperatorDetails memory operatorDetails = IDelegationManager.OperatorDetails({ +// __deprecated_earningsReceiver: operator, +// delegationApprover: address(0), +// stakerOptOutWindowBlocks: 0 +// }); +// if (!delegation.isOperator(operator)) { +// _testRegisterAsOperator(operator, operatorDetails); +// } + +// uint256 amountBefore = delegation.operatorShares(operator, wethStrat); + +// //making additional deposits to the strategies +// assertTrue(!delegation.isDelegated(staker) == true, "testDelegation: staker is not delegate"); +// _testDepositWeth(staker, ethAmount); +// _testDepositEigen(staker, eigenAmount); +// _testDelegateToOperator(staker, operator); +// assertTrue(delegation.isDelegated(staker) == true, "testDelegation: staker is not delegate"); + +// (/*IStrategy[] memory updatedStrategies*/, uint256[] memory updatedShares) = strategyManager.getDeposits(staker); + +// { +// IStrategy _strat = wethStrat; +// // IStrategy _strat = strategyManager.stakerStrats(staker, 0); +// assertTrue(address(_strat) != address(0), "stakerStrats not updated correctly"); + +// assertTrue( +// delegation.operatorShares(operator, _strat) - updatedShares[0] == amountBefore, +// "ETH operatorShares not updated correctly" +// ); + +// cheats.startPrank(address(strategyManager)); + +// IDelegationManager.OperatorDetails memory expectedOperatorDetails = delegation.operatorDetails(operator); +// assertTrue( +// keccak256(abi.encode(expectedOperatorDetails)) == keccak256(abi.encode(operatorDetails)), +// "failed to set correct operator details" +// ); +// } +// } + +// /// @notice tests that a when an operator is undelegated from, that the staker is properly classified as undelegated. +// function testUndelegation( +// address operator, +// address staker, +// uint96 ethAmount, +// uint96 eigenAmount +// ) public fuzzedAddress(operator) fuzzedAddress(staker) fuzzedAmounts(ethAmount, eigenAmount) { +// cheats.assume(staker != operator); +// // base strategy will revert if these amounts are too small on first deposit +// cheats.assume(ethAmount >= 1); +// cheats.assume(eigenAmount >= 1); +// _testDelegation(operator, staker, ethAmount, eigenAmount); + +// (IStrategy[] memory strategyArray, uint256[] memory shareAmounts) = strategyManager.getDeposits(staker); +// uint256[] memory strategyIndexes = new uint256[](strategyArray.length); + +// // withdraw shares +// _testQueueWithdrawal(staker, strategyIndexes, strategyArray, shareAmounts, staker /*withdrawer*/); + +// cheats.startPrank(staker); +// delegation.undelegate(staker); +// cheats.stopPrank(); + +// require(delegation.delegatedTo(staker) == address(0), "undelegation unsuccessful"); +// } + +// /// @notice tests delegation from a staker to operator via ECDSA signature. +// function testDelegateToBySignature( +// address operator, +// uint96 ethAmount, +// uint96 eigenAmount, +// uint256 expiry +// ) public fuzzedAddress(operator) { +// address staker = cheats.addr(PRIVATE_KEY); +// _registerOperatorAndDepositFromStaker(operator, staker, ethAmount, eigenAmount); + +// uint256 nonceBefore = delegation.stakerNonce(staker); + +// bytes32 structHash = keccak256( +// abi.encode(delegation.STAKER_DELEGATION_TYPEHASH(), staker, operator, nonceBefore, expiry) +// ); +// bytes32 digestHash = keccak256(abi.encodePacked("\x19\x01", delegation.domainSeparator(), structHash)); + +// bytes memory signature; +// { +// (uint8 v, bytes32 r, bytes32 s) = cheats.sign(PRIVATE_KEY, digestHash); +// signature = abi.encodePacked(r, s, v); +// } + +// if (expiry < block.timestamp) { +// cheats.expectRevert("DelegationManager.delegateToBySignature: staker signature expired"); +// } +// ISignatureUtils.SignatureWithExpiry memory signatureWithExpiry = ISignatureUtils.SignatureWithExpiry({ +// signature: signature, +// expiry: expiry +// }); +// delegation.delegateToBySignature(staker, operator, signatureWithExpiry, signatureWithExpiry, bytes32(0)); +// if (expiry >= block.timestamp) { +// assertTrue(delegation.isDelegated(staker) == true, "testDelegation: staker is not delegate"); +// assertTrue(nonceBefore + 1 == delegation.stakerNonce(staker), "nonce not incremented correctly"); +// assertTrue(delegation.delegatedTo(staker) == operator, "staker delegated to wrong operator"); +// } +// } + +// /// @notice tries delegating using a signature and an EIP 1271 compliant wallet +// function testDelegateToBySignature_WithContractWallet_Successfully( +// address operator, +// uint96 ethAmount, +// uint96 eigenAmount +// ) public fuzzedAddress(operator) { +// address staker = cheats.addr(PRIVATE_KEY); + +// // deploy ERC1271WalletMock for staker to use +// cheats.startPrank(staker); +// ERC1271WalletMock wallet = new ERC1271WalletMock(staker); +// cheats.stopPrank(); +// staker = address(wallet); + +// _registerOperatorAndDepositFromStaker(operator, staker, ethAmount, eigenAmount); + +// uint256 nonceBefore = delegation.stakerNonce(staker); + +// bytes32 structHash = keccak256( +// abi.encode(delegation.STAKER_DELEGATION_TYPEHASH(), staker, operator, nonceBefore, type(uint256).max) +// ); +// bytes32 digestHash = keccak256(abi.encodePacked("\x19\x01", delegation.domainSeparator(), structHash)); + +// bytes memory signature; +// { +// (uint8 v, bytes32 r, bytes32 s) = cheats.sign(PRIVATE_KEY, digestHash); +// signature = abi.encodePacked(r, s, v); +// } + +// ISignatureUtils.SignatureWithExpiry memory signatureWithExpiry = ISignatureUtils.SignatureWithExpiry({ +// signature: signature, +// expiry: type(uint256).max +// }); +// delegation.delegateToBySignature(staker, operator, signatureWithExpiry, signatureWithExpiry, bytes32(0)); +// assertTrue(delegation.isDelegated(staker) == true, "testDelegation: staker is not delegate"); +// assertTrue(nonceBefore + 1 == delegation.stakerNonce(staker), "nonce not incremented correctly"); +// assertTrue(delegation.delegatedTo(staker) == operator, "staker delegated to wrong operator"); +// } + +// /// @notice tries delegating using a signature and an EIP 1271 compliant wallet, *but* providing a bad signature +// function testDelegateToBySignature_WithContractWallet_BadSignature( +// address operator, +// uint96 ethAmount, +// uint96 eigenAmount +// ) public fuzzedAddress(operator) { +// address staker = cheats.addr(PRIVATE_KEY); + +// // deploy ERC1271WalletMock for staker to use +// cheats.startPrank(staker); +// ERC1271WalletMock wallet = new ERC1271WalletMock(staker); +// cheats.stopPrank(); +// staker = address(wallet); + +// _registerOperatorAndDepositFromStaker(operator, staker, ethAmount, eigenAmount); + +// uint256 nonceBefore = delegation.stakerNonce(staker); + +// bytes32 structHash = keccak256( +// abi.encode(delegation.STAKER_DELEGATION_TYPEHASH(), staker, operator, nonceBefore, type(uint256).max) +// ); +// bytes32 digestHash = keccak256(abi.encodePacked("\x19\x01", delegation.domainSeparator(), structHash)); + +// bytes memory signature; +// { +// (uint8 v, bytes32 r, bytes32 s) = cheats.sign(PRIVATE_KEY, digestHash); +// // mess up the signature by flipping v's parity +// v = (v == 27 ? 28 : 27); +// signature = abi.encodePacked(r, s, v); +// } + +// cheats.expectRevert( +// bytes("EIP1271SignatureUtils.checkSignature_EIP1271: ERC1271 signature verification failed") +// ); +// ISignatureUtils.SignatureWithExpiry memory signatureWithExpiry = ISignatureUtils.SignatureWithExpiry({ +// signature: signature, +// expiry: type(uint256).max +// }); +// delegation.delegateToBySignature(staker, operator, signatureWithExpiry, signatureWithExpiry, bytes32(0)); +// } + +// /// @notice tries delegating using a wallet that does not comply with EIP 1271 +// function testDelegateToBySignature_WithContractWallet_NonconformingWallet( +// address operator, +// uint96 ethAmount, +// uint96 eigenAmount, +// uint8 v, +// bytes32 r, +// bytes32 s +// ) public fuzzedAddress(operator) { +// address staker = cheats.addr(PRIVATE_KEY); + +// // deploy non ERC1271-compliant wallet for staker to use +// cheats.startPrank(staker); +// ERC1271MaliciousMock wallet = new ERC1271MaliciousMock(); +// cheats.stopPrank(); +// staker = address(wallet); + +// _registerOperatorAndDepositFromStaker(operator, staker, ethAmount, eigenAmount); + +// cheats.assume(staker != operator); + +// bytes memory signature = abi.encodePacked(r, s, v); + +// cheats.expectRevert(); +// ISignatureUtils.SignatureWithExpiry memory signatureWithExpiry = ISignatureUtils.SignatureWithExpiry({ +// signature: signature, +// expiry: type(uint256).max +// }); +// delegation.delegateToBySignature(staker, operator, signatureWithExpiry, signatureWithExpiry, bytes32(0)); +// } + +// /// @notice tests delegation to EigenLayer via an ECDSA signatures with invalid signature +// /// @param operator is the operator being delegated to. +// function testDelegateToByInvalidSignature( +// address operator, +// uint96 ethAmount, +// uint96 eigenAmount, +// uint8 v, +// bytes32 r, +// bytes32 s +// ) public fuzzedAddress(operator) fuzzedAmounts(ethAmount, eigenAmount) { +// address staker = cheats.addr(PRIVATE_KEY); +// _registerOperatorAndDepositFromStaker(operator, staker, ethAmount, eigenAmount); + +// bytes memory signature = abi.encodePacked(r, s, v); + +// cheats.expectRevert(); +// ISignatureUtils.SignatureWithExpiry memory signatureWithExpiry = ISignatureUtils.SignatureWithExpiry({ +// signature: signature, +// expiry: type(uint256).max +// }); +// delegation.delegateToBySignature(staker, operator, signatureWithExpiry, signatureWithExpiry, bytes32(0)); +// } + +// /// @notice This function tests to ensure that a delegation contract +// /// cannot be intitialized multiple times +// function testCannotInitMultipleTimesDelegation() public cannotReinit { +// //delegation has already been initialized in the Deployer test contract +// delegation.initialize( +// address(this), +// eigenLayerPauserReg, +// 0, +// minWithdrawalDelayBlocks, +// initializeStrategiesToSetDelayBlocks, +// initializeWithdrawalDelayBlocks +// ); +// } + +// /// @notice This function tests to ensure that a you can't register as a delegate multiple times +// /// @param operator is the operator being delegated to. +// function testRegisterAsOperatorMultipleTimes(address operator) public fuzzedAddress(operator) { +// IDelegationManager.OperatorDetails memory operatorDetails = IDelegationManager.OperatorDetails({ +// __deprecated_earningsReceiver: operator, +// delegationApprover: address(0), +// stakerOptOutWindowBlocks: 0 +// }); +// _testRegisterAsOperator(operator, operatorDetails); +// cheats.expectRevert(bytes("DelegationManager.registerAsOperator: caller is already actively delegated")); +// _testRegisterAsOperator(operator, operatorDetails); +// } + +// /// @notice This function tests to ensure that a staker cannot delegate to an unregistered operator +// /// @param delegate is the unregistered operator +// function testDelegationToUnregisteredDelegate(address delegate) public fuzzedAddress(delegate) { +// //deposit into 1 strategy for getOperatorAddress(1), who is delegating to the unregistered operator +// _testDepositStrategies(getOperatorAddress(1), 1e18, 1); +// _testDepositEigen(getOperatorAddress(1), 1e18); + +// cheats.expectRevert(bytes("DelegationManager.delegateTo: operator is not registered in EigenLayer")); +// cheats.startPrank(getOperatorAddress(1)); +// ISignatureUtils.SignatureWithExpiry memory signatureWithExpiry; +// delegation.delegateTo(delegate, signatureWithExpiry, bytes32(0)); +// cheats.stopPrank(); +// } + +// /// @notice This function tests to ensure that a delegation contract +// /// cannot be intitialized multiple times, test with different caller addresses +// function testCannotInitMultipleTimesDelegation(address _attacker) public { +// cheats.assume(_attacker != address(eigenLayerProxyAdmin)); +// //delegation has already been initialized in the Deployer test contract +// vm.prank(_attacker); +// cheats.expectRevert(bytes("Initializable: contract is already initialized")); +// delegation.initialize( +// _attacker, +// eigenLayerPauserReg, +// 0, +// 0, // minWithdrawalDelayBLocks +// initializeStrategiesToSetDelayBlocks, +// initializeWithdrawalDelayBlocks +// ); +// } + +// /// @notice This function tests to ensure that an address can only call registerAsOperator() once +// function testCannotRegisterAsOperatorTwice( +// address _operator, +// address _dt +// ) public fuzzedAddress(_operator) fuzzedAddress(_dt) { +// vm.assume(_dt != address(0)); +// vm.startPrank(_operator); +// IDelegationManager.OperatorDetails memory operatorDetails = IDelegationManager.OperatorDetails({ +// __deprecated_earningsReceiver: msg.sender, +// delegationApprover: address(0), +// stakerOptOutWindowBlocks: 0 +// }); +// string memory emptyStringForMetadataURI; +// delegation.registerAsOperator(operatorDetails, emptyStringForMetadataURI); +// vm.expectRevert("DelegationManager.registerAsOperator: caller is already actively delegated"); +// delegation.registerAsOperator(operatorDetails, emptyStringForMetadataURI); +// cheats.stopPrank(); +// } + +// /// @notice this function checks that you can only delegate to an address that is already registered. +// function testDelegateToInvalidOperator( +// address _staker, +// address _unregisteredoperator +// ) public fuzzedAddress(_staker) { +// vm.startPrank(_staker); +// cheats.expectRevert(bytes("DelegationManager.delegateTo: operator is not registered in EigenLayer")); +// ISignatureUtils.SignatureWithExpiry memory signatureWithExpiry; +// delegation.delegateTo(_unregisteredoperator, signatureWithExpiry, bytes32(0)); +// cheats.expectRevert(bytes("DelegationManager.delegateTo: operator is not registered in EigenLayer")); +// delegation.delegateTo(_staker, signatureWithExpiry, bytes32(0)); +// cheats.stopPrank(); +// } + +// function testUndelegate_SigP_Version(address _operator, address _staker, address _dt) public { +// vm.assume(_operator != address(0)); +// vm.assume(_staker != address(0)); +// vm.assume(_operator != _staker); +// vm.assume(_dt != address(0)); +// vm.assume(_operator != address(eigenLayerProxyAdmin)); +// vm.assume(_staker != address(eigenLayerProxyAdmin)); + +// // setup delegation +// vm.prank(_operator); +// IDelegationManager.OperatorDetails memory operatorDetails = IDelegationManager.OperatorDetails({ +// __deprecated_earningsReceiver: _dt, +// delegationApprover: address(0), +// stakerOptOutWindowBlocks: 0 +// }); +// string memory emptyStringForMetadataURI; +// delegation.registerAsOperator(operatorDetails, emptyStringForMetadataURI); +// vm.prank(_staker); +// ISignatureUtils.SignatureWithExpiry memory signatureWithExpiry; +// delegation.delegateTo(_operator, signatureWithExpiry, bytes32(0)); + +// // operators cannot undelegate from themselves +// vm.prank(_operator); +// cheats.expectRevert(bytes("DelegationManager.undelegate: operators cannot be undelegated")); +// delegation.undelegate(_operator); + +// // assert still delegated +// assertTrue(delegation.isDelegated(_staker)); +// assertTrue(delegation.isOperator(_operator)); + +// // _staker *can* undelegate themselves +// vm.prank(_staker); +// delegation.undelegate(_staker); + +// // assert undelegated +// assertTrue(!delegation.isDelegated(_staker)); +// assertTrue(delegation.isOperator(_operator)); +// } + +// function _testRegisterAdditionalOperator(uint256 index) internal { +// address sender = getOperatorAddress(index); + +// //register as both ETH and EIGEN operator +// uint256 wethToDeposit = 1e18; +// uint256 eigenToDeposit = 1e10; +// _testDepositWeth(sender, wethToDeposit); +// _testDepositEigen(sender, eigenToDeposit); +// IDelegationManager.OperatorDetails memory operatorDetails = IDelegationManager.OperatorDetails({ +// __deprecated_earningsReceiver: sender, +// delegationApprover: address(0), +// stakerOptOutWindowBlocks: 0 +// }); +// _testRegisterAsOperator(sender, operatorDetails); +// cheats.startPrank(sender); + +// cheats.stopPrank(); +// } + +// // registers the operator if they are not already registered, and deposits "WETH" + "EIGEN" on behalf of the staker. +// function _registerOperatorAndDepositFromStaker( +// address operator, +// address staker, +// uint96 ethAmount, +// uint96 eigenAmount +// ) internal { +// cheats.assume(staker != operator); + +// // if first deposit amount to base strategy is too small, it will revert. ignore that case here. +// cheats.assume(ethAmount >= 1 && ethAmount <= 1e18); +// cheats.assume(eigenAmount >= 1 && eigenAmount <= 1e18); + +// if (!delegation.isOperator(operator)) { +// IDelegationManager.OperatorDetails memory operatorDetails = IDelegationManager.OperatorDetails({ +// __deprecated_earningsReceiver: operator, +// delegationApprover: address(0), +// stakerOptOutWindowBlocks: 0 +// }); +// _testRegisterAsOperator(operator, operatorDetails); +// } + +// //making additional deposits to the strategies +// assertTrue(!delegation.isDelegated(staker) == true, "testDelegation: staker is not delegate"); +// _testDepositWeth(staker, ethAmount); +// _testDepositEigen(staker, eigenAmount); +// } +// } \ No newline at end of file diff --git a/src/test/DelegationFaucet.t.sol b/src/test/DelegationFaucet.t.sol deleted file mode 100644 index c611b8669..000000000 --- a/src/test/DelegationFaucet.t.sol +++ /dev/null @@ -1,513 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.12; - -import "script/whitelist/delegationFaucet/DelegationFaucet.sol"; -import "script/whitelist/ERC20PresetMinterPauser.sol"; - -import "src/test/EigenLayerTestHelper.t.sol"; - -contract DelegationFaucetTests is EigenLayerTestHelper { - // EigenLayer contracts - DelegationFaucet delegationFaucet; - - // M2 testing/mock contracts - ERC20PresetMinterPauser public stakeToken; - StrategyBase public stakeTokenStrat; - - bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE"); - uint256 public constant DEFAULT_AMOUNT = 100e18; - address owner = cheats.addr(1000); - - /// @notice Emitted when a queued withdrawal is completed - event WithdrawalCompleted(bytes32 withdrawalRoot); - - function setUp() public virtual override { - EigenLayerDeployer.setUp(); - - // Deploy ERC20 stakeToken, StrategyBase, and add StrategyBase to whitelist - stakeToken = new ERC20PresetMinterPauser("StakeToken", "STK"); - stakeTokenStrat = StrategyBase( - address( - new TransparentUpgradeableProxy( - address(baseStrategyImplementation), - address(eigenLayerProxyAdmin), - abi.encodeWithSelector(StrategyBase.initialize.selector, stakeToken, eigenLayerPauserReg) - ) - ) - ); - cheats.startPrank(strategyManager.strategyWhitelister()); - IStrategy[] memory _strategy = new IStrategy[](1); - bool[] memory _thirdPartyTransfersForbiddenValues = new bool[](1); - _strategy[0] = stakeTokenStrat; - strategyManager.addStrategiesToDepositWhitelist(_strategy, _thirdPartyTransfersForbiddenValues); - cheats.stopPrank(); - - // Deploy DelegationFaucet, grant it admin/mint/pauser roles, etc. - delegationFaucet = new DelegationFaucet(strategyManager, delegation, stakeToken, stakeTokenStrat); - targetContract(address(delegationFaucet)); - stakeToken.grantRole(MINTER_ROLE, address(delegationFaucet)); - } - - /** - * @notice Assertions in test - * - Checks staker contract is deployed - * - Checks token supply before/after minting - * - Checks token balances are updated correctly for staker and strategy contracts - * @param _operatorIndex is the index of the operator to use from the test-data/operators.json file - * @param _depositAmount is the amount of stakeToken to mint to the staker and deposit into the strategy - */ - function test_mintDepositAndDelegate_CheckBalancesAndDeploys(uint8 _operatorIndex, uint256 _depositAmount) public { - cheats.assume(_operatorIndex < 15 && _depositAmount < DEFAULT_AMOUNT); - if (_depositAmount == 0) { - // Passing 0 as amount param defaults the amount to DEFAULT_AMOUNT constant - _depositAmount = DEFAULT_AMOUNT; - } - // Setup Operator - address operator = getOperatorAddress(_operatorIndex); - address stakerContract = delegationFaucet.getStaker(operator); - _registerOperator(operator); - - // Mint token to Staker, deposit minted amount into strategy, and delegate to operator - uint256 supplyBefore = stakeToken.totalSupply(); - uint256 stratBalanceBefore = stakeToken.balanceOf(address(stakeTokenStrat)); - assertTrue( - !Address.isContract(stakerContract), - "test_mintDepositAndDelegate_CheckBalancesAndDeploys: staker contract shouldn't be deployed" - ); - IDelegationManager.SignatureWithExpiry memory signatureWithExpiry; - delegationFaucet.mintDepositAndDelegate(operator, signatureWithExpiry, bytes32(0), _depositAmount); - assertTrue( - Address.isContract(stakerContract), - "test_mintDepositAndDelegate_CheckBalancesAndDeploys: staker contract not deployed" - ); - uint256 supplyAfter = stakeToken.totalSupply(); - uint256 stratBalanceAfter = stakeToken.balanceOf(address(stakeTokenStrat)); - // Check token supply and balances - assertEq( - supplyAfter, - supplyBefore + _depositAmount, - "test_mintDepositAndDelegate_CheckBalancesAndDeploys: token supply not updated correctly" - ); - assertEq( - stratBalanceAfter, - stratBalanceBefore + _depositAmount, - "test_mintDepositAndDelegate_CheckBalancesAndDeploys: strategy balance not updated correctly" - ); - assertEq( - stakeToken.balanceOf(stakerContract), - 0, - "test_mintDepositAndDelegate_CheckBalancesAndDeploys: staker balance should be 0" - ); - } - - /** - * @notice Check the before/after values for strategy shares and operator shares - * @param _operatorIndex is the index of the operator to use from the test-data/operators.json file - * @param _depositAmount is the amount of stakeToken to mint to the staker and deposit into the strategy - */ - function test_mintDepositAndDelegate_StrategyAndOperatorShares( - uint8 _operatorIndex, - uint256 _depositAmount - ) public { - cheats.assume(_operatorIndex < 15 && _depositAmount < DEFAULT_AMOUNT); - if (_depositAmount == 0) { - _depositAmount = DEFAULT_AMOUNT; - } - // Setup Operator - address operator = getOperatorAddress(_operatorIndex); - address stakerContract = delegationFaucet.getStaker(operator); - _registerOperator(operator); - - // Mint token to Staker, deposit minted amount into strategy, and delegate to operator - uint256 stakerSharesBefore = strategyManager.stakerStrategyShares(stakerContract, stakeTokenStrat); - uint256 operatorSharesBefore = delegation.operatorShares(operator, stakeTokenStrat); - IDelegationManager.SignatureWithExpiry memory signatureWithExpiry; - delegationFaucet.mintDepositAndDelegate(operator, signatureWithExpiry, bytes32(0), _depositAmount); - - uint256 stakerSharesAfter = strategyManager.stakerStrategyShares(stakerContract, stakeTokenStrat); - uint256 operatorSharesAfter = delegation.operatorShares(operator, stakeTokenStrat); - assertTrue( - delegation.delegatedTo(stakerContract) == operator, - "test_mintDepositAndDelegate_StrategyAndOperatorShares: delegated address not set appropriately" - ); - assertTrue( - delegation.isDelegated(stakerContract), - "test_mintDepositAndDelegate_StrategyAndOperatorShares: delegated status not set appropriately" - ); - assertEq( - stakerSharesAfter, - stakerSharesBefore + _depositAmount, - "test_mintDepositAndDelegate_StrategyAndOperatorShares: staker shares not updated correctly" - ); - assertEq( - operatorSharesAfter, - operatorSharesBefore + _depositAmount, - "test_mintDepositAndDelegate_StrategyAndOperatorShares: operator shares not updated correctly" - ); - } - - /** - * @notice Invariant test the before/after values for strategy shares and operator shares from multiple runs - */ - /// forge-config: default.invariant.runs = 5 - /// forge-config: default.invariant.depth = 20 - function invariant_test_mintDepositAndDelegate_StrategyAndOperatorShares() public { - // Setup Operator - address operator = getOperatorAddress(0); - address stakerContract = delegationFaucet.getStaker(operator); - _registerOperator(operator); - - // Mint token to Staker, deposit minted amount into strategy, and delegate to operator - uint256 stakerSharesBefore = strategyManager.stakerStrategyShares(stakerContract, stakeTokenStrat); - uint256 operatorSharesBefore = delegation.operatorShares(operator, stakeTokenStrat); - IDelegationManager.SignatureWithExpiry memory signatureWithExpiry; - cheats.prank(delegationFaucet.owner()); - delegationFaucet.mintDepositAndDelegate(operator, signatureWithExpiry, bytes32(0), DEFAULT_AMOUNT); - - uint256 stakerSharesAfter = strategyManager.stakerStrategyShares(stakerContract, stakeTokenStrat); - uint256 operatorSharesAfter = delegation.operatorShares(operator, stakeTokenStrat); - assertTrue( - delegation.delegatedTo(stakerContract) == operator, - "test_mintDepositAndDelegate_StrategyAndOperatorShares: delegated address not set appropriately" - ); - assertTrue( - delegation.isDelegated(stakerContract), - "test_mintDepositAndDelegate_StrategyAndOperatorShares: delegated status not set appropriately" - ); - assertEq( - stakerSharesAfter, - stakerSharesBefore + DEFAULT_AMOUNT, - "test_mintDepositAndDelegate_StrategyAndOperatorShares: staker shares not updated correctly" - ); - assertEq( - operatorSharesAfter, - operatorSharesBefore + DEFAULT_AMOUNT, - "test_mintDepositAndDelegate_StrategyAndOperatorShares: operator shares not updated correctly" - ); - } - - /** - * @param _operatorIndex is the index of the operator to use from the test-data/operators.json file - */ - function test_mintDepositAndDelegate_RevertsIf_UnregisteredOperator(uint8 _operatorIndex) public { - cheats.assume(_operatorIndex < 15); - address operator = getOperatorAddress(_operatorIndex); - // Unregistered operator should revert - cheats.expectRevert("DelegationFaucet: Operator not registered"); - IDelegationManager.SignatureWithExpiry memory signatureWithExpiry; - delegationFaucet.mintDepositAndDelegate(operator, signatureWithExpiry, bytes32(0), DEFAULT_AMOUNT); - } - - function test_depositIntoStrategy_IncreaseShares(uint8 _operatorIndex, uint256 _depositAmount) public { - cheats.assume(_operatorIndex < 15 && _depositAmount < DEFAULT_AMOUNT); - if (_depositAmount == 0) { - _depositAmount = DEFAULT_AMOUNT; - } - // Setup Operator - address operator = getOperatorAddress(_operatorIndex); - address stakerContract = delegationFaucet.getStaker(operator); - _registerOperator(operator); - - // Mint token to Staker, deposit minted amount into strategy, and delegate to operator - uint256 stakerSharesBefore = strategyManager.stakerStrategyShares(stakerContract, stakeTokenStrat); - uint256 operatorSharesBefore = delegation.operatorShares(operator, stakeTokenStrat); - IDelegationManager.SignatureWithExpiry memory signatureWithExpiry; - delegationFaucet.mintDepositAndDelegate(operator, signatureWithExpiry, bytes32(0), DEFAULT_AMOUNT); - - uint256 stakerSharesAfter = strategyManager.stakerStrategyShares(stakerContract, stakeTokenStrat); - uint256 operatorSharesAfter = delegation.operatorShares(operator, stakeTokenStrat); - assertTrue( - delegation.delegatedTo(stakerContract) == operator, - "test_mintDepositAndDelegate_IncreaseShares: delegated address not set appropriately" - ); - assertTrue( - delegation.isDelegated(stakerContract), - "test_mintDepositAndDelegate_IncreaseShares: delegated status not set appropriately" - ); - assertEq( - stakerSharesAfter, - stakerSharesBefore + DEFAULT_AMOUNT, - "test_mintDepositAndDelegate_IncreaseShares: staker shares not updated correctly" - ); - assertEq( - operatorSharesAfter, - operatorSharesBefore + DEFAULT_AMOUNT, - "test_mintDepositAndDelegate_IncreaseShares: operator shares not updated correctly" - ); - - // Deposit more into strategy - stakerSharesBefore = stakerSharesAfter; - operatorSharesBefore = operatorSharesAfter; - delegationFaucet.depositIntoStrategy(stakerContract, stakeTokenStrat, stakeToken, _depositAmount); - stakerSharesAfter = strategyManager.stakerStrategyShares(stakerContract, stakeTokenStrat); - operatorSharesAfter = delegation.operatorShares(operator, stakeTokenStrat); - - assertEq( - stakerSharesAfter, - stakerSharesBefore + _depositAmount, - "test_mintDepositAndDelegate_IncreasesShares: staker shares not updated correctly" - ); - assertEq( - operatorSharesAfter, - operatorSharesBefore + _depositAmount, - "test_mintDepositAndDelegate_IncreasesShares: operator shares not updated correctly" - ); - } - - function test_queueWithdrawal_StakeTokenWithdraw(uint8 _operatorIndex, uint256 _withdrawAmount) public { - cheats.assume(_operatorIndex < 15 && 0 < _withdrawAmount && _withdrawAmount < DEFAULT_AMOUNT); - // Setup Operator - address operator = getOperatorAddress(_operatorIndex); - address stakerContract = delegationFaucet.getStaker(operator); - _registerOperator(operator); - - IDelegationManager.SignatureWithExpiry memory signatureWithExpiry; - delegationFaucet.mintDepositAndDelegate(operator, signatureWithExpiry, bytes32(0), DEFAULT_AMOUNT); - - uint256 operatorSharesBefore = delegation.operatorShares(operator, stakeTokenStrat); - uint256 stakerSharesBefore = strategyManager.stakerStrategyShares(stakerContract, stakeTokenStrat); - uint256 nonceBefore = delegation.cumulativeWithdrawalsQueued(/*staker*/ stakerContract); - - // Queue withdrawal - ( - IDelegationManager.Withdrawal memory queuedWithdrawal, - , /*tokensArray is unused in this test*/ - /*withdrawalRoot is unused in this test*/ - ) = _setUpQueuedWithdrawalStructSingleStrat( - /*staker*/ stakerContract, - /*withdrawer*/ stakerContract, - stakeToken, - stakeTokenStrat, - _withdrawAmount - ); - IDelegationManager.QueuedWithdrawalParams[] memory params = new IDelegationManager.QueuedWithdrawalParams[](1); - - params[0] = IDelegationManager.QueuedWithdrawalParams({ - strategies: queuedWithdrawal.strategies, - shares: queuedWithdrawal.shares, - withdrawer: stakerContract - }); - - delegationFaucet.queueWithdrawal( - stakerContract, - params - ); - uint256 operatorSharesAfter = delegation.operatorShares(operator, stakeTokenStrat); - uint256 stakerSharesAfter = strategyManager.stakerStrategyShares(stakerContract, stakeTokenStrat); - uint256 nonceAfter = delegation.cumulativeWithdrawalsQueued(/*staker*/ stakerContract); - - assertEq( - operatorSharesBefore, - operatorSharesAfter + _withdrawAmount, - "test_queueWithdrawal_WithdrawStakeToken: operator shares not updated correctly" - ); - // Withdrawal queued, but not withdrawn as of yet - assertEq( - stakerSharesBefore, - stakerSharesAfter + _withdrawAmount, - "test_queueWithdrawal_WithdrawStakeToken: staker shares not updated correctly" - ); - assertEq( - nonceBefore, - nonceAfter - 1, - "test_queueWithdrawal_WithdrawStakeToken: staker withdrawal nonce not updated" - ); - } - - function test_completeQueuedWithdrawal_ReceiveAsTokensMarkedFalse( - uint8 _operatorIndex, - uint256 _withdrawAmount - ) public { - test_queueWithdrawal_StakeTokenWithdraw(_operatorIndex, _withdrawAmount); - address operator = getOperatorAddress(_operatorIndex); - address stakerContract = delegationFaucet.getStaker(operator); - // assertion before values - uint256 sharesBefore = strategyManager.stakerStrategyShares(stakerContract, stakeTokenStrat); - uint256 balanceBefore = stakeToken.balanceOf(address(stakerContract)); - - // Set completeQueuedWithdrawal params - IStrategy[] memory strategyArray = new IStrategy[](1); - IERC20[] memory tokensArray = new IERC20[](1); - uint256[] memory shareAmounts = new uint256[](1); - { - strategyArray[0] = stakeTokenStrat; - shareAmounts[0] = _withdrawAmount; - tokensArray[0] = stakeToken; - } - - IDelegationManager.Withdrawal memory queuedWithdrawal; - { - uint256 nonce = delegation.cumulativeWithdrawalsQueued(stakerContract); - - queuedWithdrawal = IDelegationManager.Withdrawal({ - strategies: strategyArray, - shares: shareAmounts, - staker: stakerContract, - withdrawer: stakerContract, - nonce: (nonce - 1), - startBlock: uint32(block.number), - delegatedTo: strategyManager.delegation().delegatedTo(stakerContract) - }); - } - cheats.expectEmit(true, true, true, true, address(delegation)); - emit WithdrawalCompleted(delegation.calculateWithdrawalRoot(queuedWithdrawal)); - uint256 middlewareTimesIndex = 0; - bool receiveAsTokens = false; - delegationFaucet.completeQueuedWithdrawal( - stakerContract, - queuedWithdrawal, - tokensArray, - middlewareTimesIndex, - receiveAsTokens - ); - // assertion after values - uint256 sharesAfter = strategyManager.stakerStrategyShares(stakerContract, stakeTokenStrat); - uint256 balanceAfter = stakeToken.balanceOf(address(stakerContract)); - assertEq( - sharesBefore + _withdrawAmount, - sharesAfter, - "test_completeQueuedWithdrawal_ReceiveAsTokensMarkedFalse: staker shares not updated correctly" - ); - assertEq( - balanceBefore, - balanceAfter, - "test_completeQueuedWithdrawal_ReceiveAsTokensMarkedFalse: stakerContract balance not updated correctly" - ); - } - - function test_completeQueuedWithdrawal_ReceiveAsTokensMarkedTrue( - uint8 _operatorIndex, - uint256 _withdrawAmount - ) public { - test_queueWithdrawal_StakeTokenWithdraw(_operatorIndex, _withdrawAmount); - address operator = getOperatorAddress(_operatorIndex); - address stakerContract = delegationFaucet.getStaker(operator); - // assertion before values - uint256 sharesBefore = strategyManager.stakerStrategyShares(stakerContract, stakeTokenStrat); - uint256 balanceBefore = stakeToken.balanceOf(address(stakerContract)); - - // Set completeQueuedWithdrawal params - IStrategy[] memory strategyArray = new IStrategy[](1); - IERC20[] memory tokensArray = new IERC20[](1); - uint256[] memory shareAmounts = new uint256[](1); - { - strategyArray[0] = stakeTokenStrat; - shareAmounts[0] = _withdrawAmount; - tokensArray[0] = stakeToken; - } - - IDelegationManager.Withdrawal memory queuedWithdrawal; - { - uint256 nonce = delegation.cumulativeWithdrawalsQueued(stakerContract); - - queuedWithdrawal = IDelegationManager.Withdrawal({ - strategies: strategyArray, - shares: shareAmounts, - staker: stakerContract, - withdrawer: stakerContract, - nonce: (nonce - 1), - startBlock: uint32(block.number), - delegatedTo: strategyManager.delegation().delegatedTo(stakerContract) - }); - } - cheats.expectEmit(true, true, true, true, address(delegation)); - emit WithdrawalCompleted(delegation.calculateWithdrawalRoot(queuedWithdrawal)); - uint256 middlewareTimesIndex = 0; - bool receiveAsTokens = true; - delegationFaucet.completeQueuedWithdrawal( - stakerContract, - queuedWithdrawal, - tokensArray, - middlewareTimesIndex, - receiveAsTokens - ); - // assertion after values - uint256 sharesAfter = strategyManager.stakerStrategyShares(stakerContract, stakeTokenStrat); - uint256 balanceAfter = stakeToken.balanceOf(address(stakerContract)); - assertEq( - sharesBefore, - sharesAfter, - "test_completeQueuedWithdrawal_ReceiveAsTokensMarkedTrue: staker shares not updated correctly" - ); - assertEq( - balanceBefore + _withdrawAmount, - balanceAfter, - "test_completeQueuedWithdrawal_ReceiveAsTokensMarkedTrue: stakerContract balance not updated correctly" - ); - } - - function test_transfer_TransfersERC20(uint8 _operatorIndex, address _to, uint256 _transferAmount) public { - cheats.assume(_operatorIndex < 15); - // Setup Operator - address operator = getOperatorAddress(_operatorIndex); - address stakerContract = delegationFaucet.getStaker(operator); - _registerOperator(operator); - - // Mint token to Staker, deposit minted amount into strategy, and delegate to operator - IDelegationManager.SignatureWithExpiry memory signatureWithExpiry; - delegationFaucet.mintDepositAndDelegate(operator, signatureWithExpiry, bytes32(0), DEFAULT_AMOUNT); - - ERC20PresetMinterPauser mockToken = new ERC20PresetMinterPauser("MockToken", "MTK"); - mockToken.mint(stakerContract, _transferAmount); - - uint256 stakerBalanceBefore = mockToken.balanceOf(stakerContract); - uint256 toBalanceBefore = mockToken.balanceOf(_to); - delegationFaucet.transfer(stakerContract, address(mockToken), _to, _transferAmount); - uint256 stakerBalanceAfter = mockToken.balanceOf(stakerContract); - uint256 toBalanceAfter = mockToken.balanceOf(_to); - assertEq( - stakerBalanceBefore, - stakerBalanceAfter + _transferAmount, - "test_transfer_TransfersERC20: staker balance not updated correctly" - ); - assertEq( - toBalanceBefore + _transferAmount, - toBalanceAfter, - "test_transfer_TransfersERC20: to balance not updated correctly" - ); - } - - function _registerOperator(address _operator) internal { - IDelegationManager.OperatorDetails memory operatorDetails = IDelegationManager.OperatorDetails({ - __deprecated_earningsReceiver: _operator, - delegationApprover: address(0), - stakerOptOutWindowBlocks: 0 - }); - _testRegisterAsOperator(_operator, operatorDetails); - } - - function _setUpQueuedWithdrawalStructSingleStrat( - address staker, - address withdrawer, - IERC20 token, - IStrategy strategy, - uint256 shareAmount - ) - internal - view - returns ( - IDelegationManager.Withdrawal memory queuedWithdrawal, - IERC20[] memory tokensArray, - bytes32 withdrawalRoot - ) - { - IStrategy[] memory strategyArray = new IStrategy[](1); - tokensArray = new IERC20[](1); - uint256[] memory shareAmounts = new uint256[](1); - strategyArray[0] = strategy; - tokensArray[0] = token; - shareAmounts[0] = shareAmount; - queuedWithdrawal = IDelegationManager.Withdrawal({ - strategies: strategyArray, - shares: shareAmounts, - staker: staker, - withdrawer: withdrawer, - nonce: delegation.cumulativeWithdrawalsQueued(staker), - startBlock: uint32(block.number), - delegatedTo: strategyManager.delegation().delegatedTo(staker) - }); - // calculate the withdrawal root - withdrawalRoot = delegation.calculateWithdrawalRoot(queuedWithdrawal); - return (queuedWithdrawal, tokensArray, withdrawalRoot); - } -} diff --git a/src/test/DepositWithdraw.t.sol b/src/test/DepositWithdraw.t.sol index 8e87e245b..fcecbc47f 100644 --- a/src/test/DepositWithdraw.t.sol +++ b/src/test/DepositWithdraw.t.sol @@ -1,503 +1,503 @@ // SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.12; - -import "./EigenLayerTestHelper.t.sol"; -import "../contracts/core/StrategyManagerStorage.sol"; -import "./mocks/ERC20_OneWeiFeeOnTransfer.sol"; - -contract DepositWithdrawTests is EigenLayerTestHelper { - uint256[] public emptyUintArray; - - /** - * @notice Verifies that it is possible to deposit WETH - * @param amountToDeposit Fuzzed input for amount of WETH to deposit - */ - function testWethDeposit(uint256 amountToDeposit) public returns (uint256 amountDeposited) { - // if first deposit amount to base strategy is too small, it will revert. ignore that case here. - cheats.assume(amountToDeposit >= 1); - cheats.assume(amountToDeposit <= 1e38 - 1); - return _testDepositWeth(getOperatorAddress(0), amountToDeposit); - } - - - /// @notice deploys 'numStratsToAdd' strategies using '_testAddStrategy' and then deposits '1e18' to each of them from 'getOperatorAddress(0)' - /// @param numStratsToAdd is the number of strategies being added and deposited into - function testDepositStrategies(uint8 numStratsToAdd) public { - _testDepositStrategies(getOperatorAddress(0), 1e18, numStratsToAdd); - } - - /// @notice Verifies that it is possible to deposit eigen. - /// @param eigenToDeposit is amount of eigen to deposit into the eigen strategy - function testDepositEigen(uint96 eigenToDeposit) public { - // sanity check for inputs; keeps fuzzed tests from failing - cheats.assume(eigenToDeposit < eigenTotalSupply); - // if first deposit amount to base strategy is too small, it will revert. ignore that case here. - cheats.assume(eigenToDeposit >= 1); - _testDepositEigen(getOperatorAddress(0), eigenToDeposit); - } - - /** - * @notice Tries to deposit an unsupported token into an `StrategyBase` contract by calling `strategyManager.depositIntoStrategy`. - * Verifies that reversion occurs correctly. - */ - function testDepositUnsupportedToken() public { - IERC20 token = new ERC20PresetFixedSupply( - "badToken", - "BADTOKEN", - 100, - address(this) - ); - token.approve(address(strategyManager), type(uint256).max); - - // whitelist the strategy for deposit - cheats.startPrank(strategyManager.strategyWhitelister()); - IStrategy[] memory _strategy = new IStrategy[](1); - bool[] memory _thirdPartyTransfersForbiddenValues = new bool[](1); - _strategy[0] = wethStrat; - strategyManager.addStrategiesToDepositWhitelist(_strategy, _thirdPartyTransfersForbiddenValues); - cheats.stopPrank(); - - cheats.expectRevert(bytes("StrategyBase.deposit: Can only deposit underlyingToken")); - strategyManager.depositIntoStrategy(wethStrat, token, 10); - } - - /** - * @notice Tries to deposit into an unsupported strategy by calling `strategyManager.depositIntoStrategy`. - * Verifies that reversion occurs correctly. - */ - function testDepositNonexistentStrategy(address nonexistentStrategy) public fuzzedAddress(nonexistentStrategy) { - // assume that the fuzzed address is not already a contract! - uint256 size; - assembly { - size := extcodesize(nonexistentStrategy) - } - cheats.assume(size == 0); - // check against calls from precompile addresses -- was getting fuzzy failures from this - cheats.assume(uint160(nonexistentStrategy) > 9); - - // harcoded input - uint256 testDepositAmount = 10; - - IERC20 token = new ERC20PresetFixedSupply( - "badToken", - "BADTOKEN", - 100, - address(this) - ); - token.approve(address(strategyManager), type(uint256).max); - - // whitelist the strategy for deposit - cheats.startPrank(strategyManager.strategyWhitelister()); - IStrategy[] memory _strategy = new IStrategy[](1); - bool[] memory _thirdPartyTransfersForbiddenValues = new bool[](1); - _strategy[0] = IStrategy(nonexistentStrategy); - strategyManager.addStrategiesToDepositWhitelist(_strategy, _thirdPartyTransfersForbiddenValues); - cheats.stopPrank(); - - cheats.expectRevert(); - strategyManager.depositIntoStrategy(IStrategy(nonexistentStrategy), token, testDepositAmount); - } - - /// @notice verify that trying to deposit an amount of zero will correctly revert - function testRevertOnZeroDeposit() public { - // whitelist the strategy for deposit - cheats.startPrank(strategyManager.strategyWhitelister()); - IStrategy[] memory _strategy = new IStrategy[](1); - bool[] memory _thirdPartyTransfersForbiddenValues = new bool[](1); - _strategy[0] = wethStrat; - strategyManager.addStrategiesToDepositWhitelist(_strategy, _thirdPartyTransfersForbiddenValues); - cheats.stopPrank(); - - cheats.expectRevert(bytes("StrategyBase.deposit: newShares cannot be zero")); - strategyManager.depositIntoStrategy(wethStrat, weth, 0); - } - - - /** - * @notice Modified from existing _createQueuedWithdrawal, skips delegation and deposit steps so that we can isolate the withdrawal step - * @notice Creates a queued withdrawal from `staker`, queues a withdrawal using - * `delegation.queueWithdrawal(strategyIndexes, strategyArray, tokensArray, shareAmounts, withdrawer)` - * @notice After initiating a queued withdrawal, this test checks that `delegation.canCompleteQueuedWithdrawal` immediately returns the correct - * response depending on whether `staker` is delegated or not. - * @param staker The address to initiate the queued withdrawal - * @param amountToDeposit The amount of WETH to deposit - */ - function _createOnlyQueuedWithdrawal( - address staker, - bool /*registerAsOperator*/, - uint256 amountToDeposit, - IStrategy[] memory strategyArray, - IERC20[] memory /*tokensArray*/, - uint256[] memory shareAmounts, - uint256[] memory /*strategyIndexes*/, - address withdrawer - ) - internal returns(bytes32 withdrawalRoot, IDelegationManager.Withdrawal memory queuedWithdrawal) - { - require(amountToDeposit >= shareAmounts[0], "_createQueuedWithdrawal: sanity check failed"); - - queuedWithdrawal = IDelegationManager.Withdrawal({ - strategies: strategyArray, - shares: shareAmounts, - staker: staker, - withdrawer: withdrawer, - nonce: delegation.cumulativeWithdrawalsQueued(staker), - delegatedTo: delegation.delegatedTo(staker), - startBlock: uint32(block.number) - }); - - - IDelegationManager.QueuedWithdrawalParams[] memory params = new IDelegationManager.QueuedWithdrawalParams[](1); +pragma solidity ^0.8.27; + +// import "./EigenLayerTestHelper.t.sol"; +// import "../contracts/core/StrategyManagerStorage.sol"; +// import "./mocks/ERC20_OneWeiFeeOnTransfer.sol"; + +// contract DepositWithdrawTests is EigenLayerTestHelper { +// uint256[] public emptyUintArray; + +// /** +// * @notice Verifies that it is possible to deposit WETH +// * @param amountToDeposit Fuzzed input for amount of WETH to deposit +// */ +// function testWethDeposit(uint256 amountToDeposit) public returns (uint256 amountDeposited) { +// // if first deposit amount to base strategy is too small, it will revert. ignore that case here. +// cheats.assume(amountToDeposit >= 1); +// cheats.assume(amountToDeposit <= 1e38 - 1); +// return _testDepositWeth(getOperatorAddress(0), amountToDeposit); +// } + + +// /// @notice deploys 'numStratsToAdd' strategies using '_testAddStrategy' and then deposits '1e18' to each of them from 'getOperatorAddress(0)' +// /// @param numStratsToAdd is the number of strategies being added and deposited into +// function testDepositStrategies(uint8 numStratsToAdd) public { +// _testDepositStrategies(getOperatorAddress(0), 1e18, numStratsToAdd); +// } + +// /// @notice Verifies that it is possible to deposit eigen. +// /// @param eigenToDeposit is amount of eigen to deposit into the eigen strategy +// function testDepositEigen(uint96 eigenToDeposit) public { +// // sanity check for inputs; keeps fuzzed tests from failing +// cheats.assume(eigenToDeposit < eigenTotalSupply); +// // if first deposit amount to base strategy is too small, it will revert. ignore that case here. +// cheats.assume(eigenToDeposit >= 1); +// _testDepositEigen(getOperatorAddress(0), eigenToDeposit); +// } + +// /** +// * @notice Tries to deposit an unsupported token into an `StrategyBase` contract by calling `strategyManager.depositIntoStrategy`. +// * Verifies that reversion occurs correctly. +// */ +// function testDepositUnsupportedToken() public { +// IERC20 token = new ERC20PresetFixedSupply( +// "badToken", +// "BADTOKEN", +// 100, +// address(this) +// ); +// token.approve(address(strategyManager), type(uint256).max); + +// // whitelist the strategy for deposit +// cheats.startPrank(strategyManager.strategyWhitelister()); +// IStrategy[] memory _strategy = new IStrategy[](1); +// bool[] memory _thirdPartyTransfersForbiddenValues = new bool[](1); +// _strategy[0] = wethStrat; +// strategyManager.addStrategiesToDepositWhitelist(_strategy, _thirdPartyTransfersForbiddenValues); +// cheats.stopPrank(); + +// cheats.expectRevert(bytes("StrategyBase.deposit: Can only deposit underlyingToken")); +// strategyManager.depositIntoStrategy(wethStrat, token, 10); +// } + +// /** +// * @notice Tries to deposit into an unsupported strategy by calling `strategyManager.depositIntoStrategy`. +// * Verifies that reversion occurs correctly. +// */ +// function testDepositNonexistentStrategy(address nonexistentStrategy) public fuzzedAddress(nonexistentStrategy) { +// // assume that the fuzzed address is not already a contract! +// uint256 size; +// assembly { +// size := extcodesize(nonexistentStrategy) +// } +// cheats.assume(size == 0); +// // check against calls from precompile addresses -- was getting fuzzy failures from this +// cheats.assume(uint160(nonexistentStrategy) > 9); + +// // harcoded input +// uint256 testDepositAmount = 10; + +// IERC20 token = new ERC20PresetFixedSupply( +// "badToken", +// "BADTOKEN", +// 100, +// address(this) +// ); +// token.approve(address(strategyManager), type(uint256).max); + +// // whitelist the strategy for deposit +// cheats.startPrank(strategyManager.strategyWhitelister()); +// IStrategy[] memory _strategy = new IStrategy[](1); +// bool[] memory _thirdPartyTransfersForbiddenValues = new bool[](1); +// _strategy[0] = IStrategy(nonexistentStrategy); +// strategyManager.addStrategiesToDepositWhitelist(_strategy, _thirdPartyTransfersForbiddenValues); +// cheats.stopPrank(); + +// cheats.expectRevert(); +// strategyManager.depositIntoStrategy(IStrategy(nonexistentStrategy), token, testDepositAmount); +// } + +// /// @notice verify that trying to deposit an amount of zero will correctly revert +// function testRevertOnZeroDeposit() public { +// // whitelist the strategy for deposit +// cheats.startPrank(strategyManager.strategyWhitelister()); +// IStrategy[] memory _strategy = new IStrategy[](1); +// bool[] memory _thirdPartyTransfersForbiddenValues = new bool[](1); +// _strategy[0] = wethStrat; +// strategyManager.addStrategiesToDepositWhitelist(_strategy, _thirdPartyTransfersForbiddenValues); +// cheats.stopPrank(); + +// cheats.expectRevert(bytes("StrategyBase.deposit: newShares cannot be zero")); +// strategyManager.depositIntoStrategy(wethStrat, weth, 0); +// } + + +// /** +// * @notice Modified from existing _createQueuedWithdrawal, skips delegation and deposit steps so that we can isolate the withdrawal step +// * @notice Creates a queued withdrawal from `staker`, queues a withdrawal using +// * `delegation.queueWithdrawal(strategyIndexes, strategyArray, tokensArray, shareAmounts, withdrawer)` +// * @notice After initiating a queued withdrawal, this test checks that `delegation.canCompleteQueuedWithdrawal` immediately returns the correct +// * response depending on whether `staker` is delegated or not. +// * @param staker The address to initiate the queued withdrawal +// * @param amountToDeposit The amount of WETH to deposit +// */ +// function _createOnlyQueuedWithdrawal( +// address staker, +// bool /*registerAsOperator*/, +// uint256 amountToDeposit, +// IStrategy[] memory strategyArray, +// IERC20[] memory /*tokensArray*/, +// uint256[] memory shareAmounts, +// uint256[] memory /*strategyIndexes*/, +// address withdrawer +// ) +// internal returns(bytes32 withdrawalRoot, IDelegationManager.Withdrawal memory queuedWithdrawal) +// { +// require(amountToDeposit >= shareAmounts[0], "_createQueuedWithdrawal: sanity check failed"); + +// queuedWithdrawal = IDelegationManager.Withdrawal({ +// strategies: strategyArray, +// shares: shareAmounts, +// staker: staker, +// withdrawer: withdrawer, +// nonce: delegation.cumulativeWithdrawalsQueued(staker), +// delegatedTo: delegation.delegatedTo(staker), +// startBlock: uint32(block.number) +// }); + + +// IDelegationManager.QueuedWithdrawalParams[] memory params = new IDelegationManager.QueuedWithdrawalParams[](1); - params[0] = IDelegationManager.QueuedWithdrawalParams({ - strategies: strategyArray, - shares: shareAmounts, - withdrawer: withdrawer - }); - - bytes32[] memory withdrawalRoots = new bytes32[](1); - - //queue the withdrawal - cheats.startPrank(staker); - withdrawalRoots = delegation.queueWithdrawals(params); - cheats.stopPrank(); - return (withdrawalRoots[0], queuedWithdrawal); - } +// params[0] = IDelegationManager.QueuedWithdrawalParams({ +// strategies: strategyArray, +// shares: shareAmounts, +// withdrawer: withdrawer +// }); + +// bytes32[] memory withdrawalRoots = new bytes32[](1); + +// //queue the withdrawal +// cheats.startPrank(staker); +// withdrawalRoots = delegation.queueWithdrawals(params); +// cheats.stopPrank(); +// return (withdrawalRoots[0], queuedWithdrawal); +// } - function testFrontrunFirstDepositor(/*uint256 depositAmount*/) public { +// function testFrontrunFirstDepositor(/*uint256 depositAmount*/) public { - //setup addresses - address attacker = address(100); - address user = address(200); - - //give 2 ether to attacker and user - weth.transfer(attacker,2 ether); - weth.transfer(user,2 ether); - - //attacker FRONTRUN: deposit 1 wei (receive 1 share) - StrategyManager _strategyManager = _whitelistStrategy(strategyManager, wethStrat); - - cheats.startPrank(attacker); - weth.approve(address(strategyManager), type(uint256).max); - _strategyManager.depositIntoStrategy(wethStrat, weth, 1 wei); - cheats.stopPrank(); - - //attacker FRONTRUN: transfer 1 ether into strategy directly to manipulate the value of shares - cheats.prank(attacker); - weth.transfer(address(wethStrat),1 ether); - - //user deposits 2 eth into strategy - only gets 1 share due to rounding - cheats.startPrank(user); - weth.approve(address(_strategyManager), type(uint256).max); - _strategyManager.depositIntoStrategy(wethStrat, weth, 2 ether); - cheats.stopPrank(); - - //attacker deposited 1 ether and 1 wei - received 1 share - //user deposited 2 ether - received X shares - //user has lost 0.5 ether? - (, uint256[] memory shares) = _strategyManager.getDeposits(attacker); - uint256 attackerValueWeth = wethStrat.sharesToUnderlyingView(shares[0]); - require(attackerValueWeth >= (1), "attacker got zero shares"); - - (, shares) = _strategyManager.getDeposits(user); - uint256 userValueWeth = wethStrat.sharesToUnderlyingView(shares[0]); - require(userValueWeth >= (1900000000000000000), "user has lost more than 0.1 eth from frontrunning"); - - uint256 attackerLossesWeth = (2 ether + 1 wei) - attackerValueWeth; - uint256 userLossesWeth = 2 ether - userValueWeth; - require(attackerLossesWeth > userLossesWeth, "griefing attack deals more damage than cost"); - } - - // fuzzed amounts user uint96's to be more realistic with amounts - function testFrontrunFirstDepositorFuzzed(uint96 firstDepositAmount, uint96 donationAmount, uint96 secondDepositAmount) public { - // want to only use nonzero amounts or else we'll get reverts - cheats.assume(firstDepositAmount != 0 && secondDepositAmount != 0); - - // setup addresses - address attacker = address(100); - address user = address(200); - - // attacker makes first deposit - _testDepositToStrategy(attacker, firstDepositAmount, weth, wethStrat); - - // transfer tokens into strategy directly to manipulate the value of shares - weth.transfer(address(wethStrat), donationAmount); - - // filter out calls that would revert for minting zero shares - cheats.assume(wethStrat.underlyingToShares(secondDepositAmount) != 0); - - // user makes 2nd deposit into strategy - gets diminished shares due to rounding - _testDepositToStrategy(user, secondDepositAmount, weth, wethStrat); - - // check for griefing - (, uint256[] memory shares) = strategyManager.getDeposits(attacker); - uint256 attackerValueWeth = wethStrat.sharesToUnderlyingView(shares[0]); - (, shares) = strategyManager.getDeposits(user); - uint256 userValueWeth = wethStrat.sharesToUnderlyingView(shares[0]); - - uint256 attackerCost = uint256(firstDepositAmount) + uint256(donationAmount); - require(attackerCost >= attackerValueWeth, "attacker gained value?"); - // uint256 attackerLossesWeth = attackerValueWeth > attackerCost ? 0 : (attackerCost - attackerValueWeth); - uint256 attackerLossesWeth = attackerCost - attackerValueWeth; - uint256 userLossesWeth = secondDepositAmount - userValueWeth; - - emit log_named_uint("attackerLossesWeth", attackerLossesWeth); - emit log_named_uint("userLossesWeth", userLossesWeth); - - // use '+1' here to account for rounding. given the attack will cost ETH in the form of gas, this is fine. - require(attackerLossesWeth + 1 >= userLossesWeth, "griefing attack deals more damage than cost"); - } - - - function testDepositTokenWithOneWeiFeeOnTransfer(address sender, uint64 amountToDeposit) public fuzzedAddress(sender) { - cheats.assume(amountToDeposit != 0); - - IERC20 underlyingToken; - - { - uint256 initSupply = 1e50; - address initOwner = address(this); - ERC20_OneWeiFeeOnTransfer oneWeiFeeOnTransferToken = new ERC20_OneWeiFeeOnTransfer(initSupply, initOwner); - underlyingToken = IERC20(address(oneWeiFeeOnTransferToken)); - } - - // need to transfer extra here because otherwise the `sender` won't have enough tokens - underlyingToken.transfer(sender, 1000); - - IStrategy oneWeiFeeOnTransferTokenStrategy = StrategyBase( - address( - new TransparentUpgradeableProxy( - address(baseStrategyImplementation), - address(eigenLayerProxyAdmin), - abi.encodeWithSelector(StrategyBase.initialize.selector, underlyingToken, eigenLayerPauserReg) - ) - ) - ); - - // REMAINDER OF CODE ADAPTED FROM `_testDepositToStrategy` - // _testDepositToStrategy(sender, amountToDeposit, underlyingToken, oneWeiFeeOnTransferTokenStrategy); - - // whitelist the strategy for deposit, in case it wasn't before - { - cheats.startPrank(strategyManager.strategyWhitelister()); - IStrategy[] memory _strategy = new IStrategy[](1); - bool[] memory _thirdPartyTransfersForbiddenValues = new bool[](1); - _strategy[0] = oneWeiFeeOnTransferTokenStrategy; - strategyManager.addStrategiesToDepositWhitelist(_strategy, _thirdPartyTransfersForbiddenValues); - cheats.stopPrank(); - } +// //setup addresses +// address attacker = address(100); +// address user = address(200); + +// //give 2 ether to attacker and user +// weth.transfer(attacker,2 ether); +// weth.transfer(user,2 ether); + +// //attacker FRONTRUN: deposit 1 wei (receive 1 share) +// StrategyManager _strategyManager = _whitelistStrategy(strategyManager, wethStrat); + +// cheats.startPrank(attacker); +// weth.approve(address(strategyManager), type(uint256).max); +// _strategyManager.depositIntoStrategy(wethStrat, weth, 1 wei); +// cheats.stopPrank(); + +// //attacker FRONTRUN: transfer 1 ether into strategy directly to manipulate the value of shares +// cheats.prank(attacker); +// weth.transfer(address(wethStrat),1 ether); + +// //user deposits 2 eth into strategy - only gets 1 share due to rounding +// cheats.startPrank(user); +// weth.approve(address(_strategyManager), type(uint256).max); +// _strategyManager.depositIntoStrategy(wethStrat, weth, 2 ether); +// cheats.stopPrank(); + +// //attacker deposited 1 ether and 1 wei - received 1 share +// //user deposited 2 ether - received X shares +// //user has lost 0.5 ether? +// (, uint256[] memory shares) = _strategyManager.getDeposits(attacker); +// uint256 attackerValueWeth = wethStrat.sharesToUnderlyingView(shares[0]); +// require(attackerValueWeth >= (1), "attacker got zero shares"); + +// (, shares) = _strategyManager.getDeposits(user); +// uint256 userValueWeth = wethStrat.sharesToUnderlyingView(shares[0]); +// require(userValueWeth >= (1900000000000000000), "user has lost more than 0.1 eth from frontrunning"); + +// uint256 attackerLossesWeth = (2 ether + 1 wei) - attackerValueWeth; +// uint256 userLossesWeth = 2 ether - userValueWeth; +// require(attackerLossesWeth > userLossesWeth, "griefing attack deals more damage than cost"); +// } + +// // fuzzed amounts user uint96's to be more realistic with amounts +// function testFrontrunFirstDepositorFuzzed(uint96 firstDepositAmount, uint96 donationAmount, uint96 secondDepositAmount) public { +// // want to only use nonzero amounts or else we'll get reverts +// cheats.assume(firstDepositAmount != 0 && secondDepositAmount != 0); + +// // setup addresses +// address attacker = address(100); +// address user = address(200); + +// // attacker makes first deposit +// _testDepositToStrategy(attacker, firstDepositAmount, weth, wethStrat); + +// // transfer tokens into strategy directly to manipulate the value of shares +// weth.transfer(address(wethStrat), donationAmount); + +// // filter out calls that would revert for minting zero shares +// cheats.assume(wethStrat.underlyingToShares(secondDepositAmount) != 0); + +// // user makes 2nd deposit into strategy - gets diminished shares due to rounding +// _testDepositToStrategy(user, secondDepositAmount, weth, wethStrat); + +// // check for griefing +// (, uint256[] memory shares) = strategyManager.getDeposits(attacker); +// uint256 attackerValueWeth = wethStrat.sharesToUnderlyingView(shares[0]); +// (, shares) = strategyManager.getDeposits(user); +// uint256 userValueWeth = wethStrat.sharesToUnderlyingView(shares[0]); + +// uint256 attackerCost = uint256(firstDepositAmount) + uint256(donationAmount); +// require(attackerCost >= attackerValueWeth, "attacker gained value?"); +// // uint256 attackerLossesWeth = attackerValueWeth > attackerCost ? 0 : (attackerCost - attackerValueWeth); +// uint256 attackerLossesWeth = attackerCost - attackerValueWeth; +// uint256 userLossesWeth = secondDepositAmount - userValueWeth; + +// emit log_named_uint("attackerLossesWeth", attackerLossesWeth); +// emit log_named_uint("userLossesWeth", userLossesWeth); + +// // use '+1' here to account for rounding. given the attack will cost ETH in the form of gas, this is fine. +// require(attackerLossesWeth + 1 >= userLossesWeth, "griefing attack deals more damage than cost"); +// } + + +// function testDepositTokenWithOneWeiFeeOnTransfer(address sender, uint64 amountToDeposit) public fuzzedAddress(sender) { +// cheats.assume(amountToDeposit != 0); + +// IERC20 underlyingToken; + +// { +// uint256 initSupply = 1e50; +// address initOwner = address(this); +// ERC20_OneWeiFeeOnTransfer oneWeiFeeOnTransferToken = new ERC20_OneWeiFeeOnTransfer(initSupply, initOwner); +// underlyingToken = IERC20(address(oneWeiFeeOnTransferToken)); +// } + +// // need to transfer extra here because otherwise the `sender` won't have enough tokens +// underlyingToken.transfer(sender, 1000); + +// IStrategy oneWeiFeeOnTransferTokenStrategy = StrategyBase( +// address( +// new TransparentUpgradeableProxy( +// address(baseStrategyImplementation), +// address(eigenLayerProxyAdmin), +// abi.encodeWithSelector(StrategyBase.initialize.selector, underlyingToken, eigenLayerPauserReg) +// ) +// ) +// ); + +// // REMAINDER OF CODE ADAPTED FROM `_testDepositToStrategy` +// // _testDepositToStrategy(sender, amountToDeposit, underlyingToken, oneWeiFeeOnTransferTokenStrategy); + +// // whitelist the strategy for deposit, in case it wasn't before +// { +// cheats.startPrank(strategyManager.strategyWhitelister()); +// IStrategy[] memory _strategy = new IStrategy[](1); +// bool[] memory _thirdPartyTransfersForbiddenValues = new bool[](1); +// _strategy[0] = oneWeiFeeOnTransferTokenStrategy; +// strategyManager.addStrategiesToDepositWhitelist(_strategy, _thirdPartyTransfersForbiddenValues); +// cheats.stopPrank(); +// } - uint256 operatorSharesBefore = strategyManager.stakerStrategyShares(sender, oneWeiFeeOnTransferTokenStrategy); - // check the expected output - uint256 expectedSharesOut = oneWeiFeeOnTransferTokenStrategy.underlyingToShares(amountToDeposit); - - underlyingToken.transfer(sender, amountToDeposit); - cheats.startPrank(sender); - underlyingToken.approve(address(strategyManager), type(uint256).max); - strategyManager.depositIntoStrategy(oneWeiFeeOnTransferTokenStrategy, underlyingToken, amountToDeposit); - - //check if depositor has never used this strat, that it is added correctly to stakerStrategyList array. - if (operatorSharesBefore == 0) { - // check that strategy is appropriately added to dynamic array of all of sender's strategies - assertTrue( - strategyManager.stakerStrategyList(sender, strategyManager.stakerStrategyListLength(sender) - 1) - == oneWeiFeeOnTransferTokenStrategy, - "_testDepositToStrategy: stakerStrategyList array updated incorrectly" - ); - } +// uint256 operatorSharesBefore = strategyManager.stakerStrategyShares(sender, oneWeiFeeOnTransferTokenStrategy); +// // check the expected output +// uint256 expectedSharesOut = oneWeiFeeOnTransferTokenStrategy.underlyingToShares(amountToDeposit); + +// underlyingToken.transfer(sender, amountToDeposit); +// cheats.startPrank(sender); +// underlyingToken.approve(address(strategyManager), type(uint256).max); +// strategyManager.depositIntoStrategy(oneWeiFeeOnTransferTokenStrategy, underlyingToken, amountToDeposit); + +// //check if depositor has never used this strat, that it is added correctly to stakerStrategyList array. +// if (operatorSharesBefore == 0) { +// // check that strategy is appropriately added to dynamic array of all of sender's strategies +// assertTrue( +// strategyManager.stakerStrategyList(sender, strategyManager.stakerStrategyListLength(sender) - 1) +// == oneWeiFeeOnTransferTokenStrategy, +// "_testDepositToStrategy: stakerStrategyList array updated incorrectly" +// ); +// } - // check that the shares out match the expected amount out - // the actual transfer in will be lower by 1 wei than expected due to stETH's internal rounding - // to account for this we check approximate rather than strict equivalence here - { - uint256 actualSharesOut = strategyManager.stakerStrategyShares(sender, oneWeiFeeOnTransferTokenStrategy) - operatorSharesBefore; - require((actualSharesOut * 1000) / expectedSharesOut > 998, "too few shares"); - require((actualSharesOut * 1000) / expectedSharesOut < 1002, "too many shares"); - - // additional sanity check for deposit not increasing in value - require(oneWeiFeeOnTransferTokenStrategy.sharesToUnderlying(actualSharesOut) <= amountToDeposit, "value cannot have increased"); - } - cheats.stopPrank(); - } - - /// @notice Shadow-forks mainnet and tests depositing stETH tokens into a "StrategyBase" contract. - function testForkMainnetDepositSteth() public { - // hard-coded inputs - // address sender = address(this); - uint64 amountToDeposit = 1e12; - - // shadow-fork mainnet - try cheats.createFork("mainnet") returns (uint256 forkId) { - cheats.selectFork(forkId); - // If RPC_MAINNET ENV not set, default to this mainnet RPC endpoint - } catch { - cheats.createSelectFork("https://eth.llamarpc.com"); - } - - // cast mainnet stETH address to IERC20 interface - // IERC20 steth = IERC20(0xae7ab96520DE3A18E5e111B5EaAb095312D7fE84); - IERC20 underlyingToken = IERC20(0xae7ab96520DE3A18E5e111B5EaAb095312D7fE84); - - // deploy necessary contracts on the shadow-forked network - // deploy proxy admin for ability to upgrade proxy contracts - eigenLayerProxyAdmin = new ProxyAdmin(); - //deploy pauser registry - address[] memory pausers = new address[](1); - pausers[0] = pauser; - eigenLayerPauserReg = new PauserRegistry(pausers, unpauser); - /** - * 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. - */ - emptyContract = new EmptyContract(); - delegation = DelegationManager( - address(new TransparentUpgradeableProxy(address(emptyContract), address(eigenLayerProxyAdmin), "")) - ); - strategyManager = StrategyManager( - address(new TransparentUpgradeableProxy(address(emptyContract), address(eigenLayerProxyAdmin), "")) - ); - slasher = Slasher( - address(new TransparentUpgradeableProxy(address(emptyContract), address(eigenLayerProxyAdmin), "")) - ); - eigenPodManager = EigenPodManager( - address(new TransparentUpgradeableProxy(address(emptyContract), address(eigenLayerProxyAdmin), "")) - ); - - ethPOSDeposit = new ETHPOSDepositMock(); - pod = new EigenPod(ethPOSDeposit, eigenPodManager, GOERLI_GENESIS_TIME); - - eigenPodBeacon = new UpgradeableBeacon(address(pod)); - - // Second, deploy the *implementation* contracts, using the *proxy contracts* as inputs - DelegationManager delegationImplementation = new DelegationManager(strategyManager, slasher, eigenPodManager); - StrategyManager strategyManagerImplementation = new StrategyManager(delegation, eigenPodManager, slasher); - Slasher slasherImplementation = new Slasher(strategyManager, delegation); - EigenPodManager eigenPodManagerImplementation = new EigenPodManager(ethPOSDeposit, eigenPodBeacon, strategyManager, slasher, delegation); - // Third, upgrade the proxy contracts to use the correct implementation contracts and initialize them. - eigenLayerProxyAdmin.upgradeAndCall( - TransparentUpgradeableProxy(payable(address(delegation))), - address(delegationImplementation), - abi.encodeWithSelector( - DelegationManager.initialize.selector, - eigenLayerReputedMultisig, - eigenLayerPauserReg, - 0 /*initialPausedStatus*/, - minWithdrawalDelayBlocks, - initializeStrategiesToSetDelayBlocks, - initializeWithdrawalDelayBlocks - ) - ); - eigenLayerProxyAdmin.upgradeAndCall( - TransparentUpgradeableProxy(payable(address(strategyManager))), - address(strategyManagerImplementation), - abi.encodeWithSelector( - StrategyManager.initialize.selector, - eigenLayerReputedMultisig, - eigenLayerReputedMultisig, - eigenLayerPauserReg, - 0/*initialPausedStatus*/ - ) - ); - eigenLayerProxyAdmin.upgradeAndCall( - TransparentUpgradeableProxy(payable(address(slasher))), - address(slasherImplementation), - abi.encodeWithSelector( - Slasher.initialize.selector, - eigenLayerReputedMultisig, - eigenLayerPauserReg, - 0/*initialPausedStatus*/ - ) - ); - eigenLayerProxyAdmin.upgradeAndCall( - TransparentUpgradeableProxy(payable(address(eigenPodManager))), - address(eigenPodManagerImplementation), - abi.encodeWithSelector( - EigenPodManager.initialize.selector, - eigenLayerReputedMultisig, - eigenLayerPauserReg, - 0/*initialPausedStatus*/ - ) - ); - - // cheat a bunch of ETH to this address - cheats.deal(address(this), 1e20); - // deposit a huge amount of ETH to get ample stETH - { - (bool success, bytes memory returnData) = address(underlyingToken).call{value: 1e20}(""); - require(success, "depositing stETH failed"); - returnData; - } - - // deploy StrategyBase contract implementation, then create upgradeable proxy that points to implementation and initialize it - baseStrategyImplementation = new StrategyBase(strategyManager); - IStrategy stethStrategy = StrategyBase( - address( - new TransparentUpgradeableProxy( - address(baseStrategyImplementation), - address(eigenLayerProxyAdmin), - abi.encodeWithSelector(StrategyBase.initialize.selector, underlyingToken, eigenLayerPauserReg) - ) - ) - ); - - // REMAINDER OF CODE ADAPTED FROM `_testDepositToStrategy` - // _testDepositToStrategy(sender, amountToDeposit, underlyingToken, stethStrategy); - - // whitelist the strategy for deposit, in case it wasn't before - { - cheats.startPrank(strategyManager.strategyWhitelister()); - IStrategy[] memory _strategy = new IStrategy[](1); - bool[] memory _thirdPartyTransfersForbiddenValues = new bool[](1); - _strategy[0] = stethStrategy; - strategyManager.addStrategiesToDepositWhitelist(_strategy, _thirdPartyTransfersForbiddenValues); - cheats.stopPrank(); - } - - uint256 operatorSharesBefore = strategyManager.stakerStrategyShares(address(this), stethStrategy); - // check the expected output - uint256 expectedSharesOut = stethStrategy.underlyingToShares(amountToDeposit); - - underlyingToken.transfer(address(this), amountToDeposit); - cheats.startPrank(address(this)); - underlyingToken.approve(address(strategyManager), type(uint256).max); - strategyManager.depositIntoStrategy(stethStrategy, underlyingToken, amountToDeposit); - - //check if depositor has never used this strat, that it is added correctly to stakerStrategyList array. - if (operatorSharesBefore == 0) { - // check that strategy is appropriately added to dynamic array of all of sender's strategies - assertTrue( - strategyManager.stakerStrategyList(address(this), strategyManager.stakerStrategyListLength(address(this)) - 1) - == stethStrategy, - "_testDepositToStrategy: stakerStrategyList array updated incorrectly" - ); - } +// // check that the shares out match the expected amount out +// // the actual transfer in will be lower by 1 wei than expected due to stETH's internal rounding +// // to account for this we check approximate rather than strict equivalence here +// { +// uint256 actualSharesOut = strategyManager.stakerStrategyShares(sender, oneWeiFeeOnTransferTokenStrategy) - operatorSharesBefore; +// require((actualSharesOut * 1000) / expectedSharesOut > 998, "too few shares"); +// require((actualSharesOut * 1000) / expectedSharesOut < 1002, "too many shares"); + +// // additional sanity check for deposit not increasing in value +// require(oneWeiFeeOnTransferTokenStrategy.sharesToUnderlying(actualSharesOut) <= amountToDeposit, "value cannot have increased"); +// } +// cheats.stopPrank(); +// } + +// /// @notice Shadow-forks mainnet and tests depositing stETH tokens into a "StrategyBase" contract. +// function testForkMainnetDepositSteth() public { +// // hard-coded inputs +// // address sender = address(this); +// uint64 amountToDeposit = 1e12; + +// // shadow-fork mainnet +// try cheats.createFork("mainnet") returns (uint256 forkId) { +// cheats.selectFork(forkId); +// // If RPC_MAINNET ENV not set, default to this mainnet RPC endpoint +// } catch { +// cheats.createSelectFork("https://eth.llamarpc.com"); +// } + +// // cast mainnet stETH address to IERC20 interface +// // IERC20 steth = IERC20(0xae7ab96520DE3A18E5e111B5EaAb095312D7fE84); +// IERC20 underlyingToken = IERC20(0xae7ab96520DE3A18E5e111B5EaAb095312D7fE84); + +// // deploy necessary contracts on the shadow-forked network +// // deploy proxy admin for ability to upgrade proxy contracts +// eigenLayerProxyAdmin = new ProxyAdmin(); +// //deploy pauser registry +// address[] memory pausers = new address[](1); +// pausers[0] = pauser; +// eigenLayerPauserReg = new PauserRegistry(pausers, unpauser); +// /** +// * 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. +// */ +// emptyContract = new EmptyContract(); +// delegation = DelegationManager( +// address(new TransparentUpgradeableProxy(address(emptyContract), address(eigenLayerProxyAdmin), "")) +// ); +// strategyManager = StrategyManager( +// address(new TransparentUpgradeableProxy(address(emptyContract), address(eigenLayerProxyAdmin), "")) +// ); +// slasher = Slasher( +// address(new TransparentUpgradeableProxy(address(emptyContract), address(eigenLayerProxyAdmin), "")) +// ); +// eigenPodManager = EigenPodManager( +// address(new TransparentUpgradeableProxy(address(emptyContract), address(eigenLayerProxyAdmin), "")) +// ); + +// ethPOSDeposit = new ETHPOSDepositMock(); +// pod = new EigenPod(ethPOSDeposit, eigenPodManager, GOERLI_GENESIS_TIME); + +// eigenPodBeacon = new UpgradeableBeacon(address(pod)); + +// // Second, deploy the *implementation* contracts, using the *proxy contracts* as inputs +// DelegationManager delegationImplementation = new DelegationManager(strategyManager, slasher, eigenPodManager); +// StrategyManager strategyManagerImplementation = new StrategyManager(delegation, eigenPodManager, slasher); +// Slasher slasherImplementation = new Slasher(strategyManager, delegation); +// EigenPodManager eigenPodManagerImplementation = new EigenPodManager(ethPOSDeposit, eigenPodBeacon, strategyManager, slasher, delegation); +// // Third, upgrade the proxy contracts to use the correct implementation contracts and initialize them. +// eigenLayerProxyAdmin.upgradeAndCall( +// TransparentUpgradeableProxy(payable(address(delegation))), +// address(delegationImplementation), +// abi.encodeWithSelector( +// DelegationManager.initialize.selector, +// eigenLayerReputedMultisig, +// eigenLayerPauserReg, +// 0 /*initialPausedStatus*/, +// minWithdrawalDelayBlocks, +// initializeStrategiesToSetDelayBlocks, +// initializeWithdrawalDelayBlocks +// ) +// ); +// eigenLayerProxyAdmin.upgradeAndCall( +// TransparentUpgradeableProxy(payable(address(strategyManager))), +// address(strategyManagerImplementation), +// abi.encodeWithSelector( +// StrategyManager.initialize.selector, +// eigenLayerReputedMultisig, +// eigenLayerReputedMultisig, +// eigenLayerPauserReg, +// 0/*initialPausedStatus*/ +// ) +// ); +// eigenLayerProxyAdmin.upgradeAndCall( +// TransparentUpgradeableProxy(payable(address(slasher))), +// address(slasherImplementation), +// abi.encodeWithSelector( +// Slasher.initialize.selector, +// eigenLayerReputedMultisig, +// eigenLayerPauserReg, +// 0/*initialPausedStatus*/ +// ) +// ); +// eigenLayerProxyAdmin.upgradeAndCall( +// TransparentUpgradeableProxy(payable(address(eigenPodManager))), +// address(eigenPodManagerImplementation), +// abi.encodeWithSelector( +// EigenPodManager.initialize.selector, +// eigenLayerReputedMultisig, +// eigenLayerPauserReg, +// 0/*initialPausedStatus*/ +// ) +// ); + +// // cheat a bunch of ETH to this address +// cheats.deal(address(this), 1e20); +// // deposit a huge amount of ETH to get ample stETH +// { +// (bool success, bytes memory returnData) = address(underlyingToken).call{value: 1e20}(""); +// require(success, "depositing stETH failed"); +// returnData; +// } + +// // deploy StrategyBase contract implementation, then create upgradeable proxy that points to implementation and initialize it +// baseStrategyImplementation = new StrategyBase(strategyManager); +// IStrategy stethStrategy = StrategyBase( +// address( +// new TransparentUpgradeableProxy( +// address(baseStrategyImplementation), +// address(eigenLayerProxyAdmin), +// abi.encodeWithSelector(StrategyBase.initialize.selector, underlyingToken, eigenLayerPauserReg) +// ) +// ) +// ); + +// // REMAINDER OF CODE ADAPTED FROM `_testDepositToStrategy` +// // _testDepositToStrategy(sender, amountToDeposit, underlyingToken, stethStrategy); + +// // whitelist the strategy for deposit, in case it wasn't before +// { +// cheats.startPrank(strategyManager.strategyWhitelister()); +// IStrategy[] memory _strategy = new IStrategy[](1); +// bool[] memory _thirdPartyTransfersForbiddenValues = new bool[](1); +// _strategy[0] = stethStrategy; +// strategyManager.addStrategiesToDepositWhitelist(_strategy, _thirdPartyTransfersForbiddenValues); +// cheats.stopPrank(); +// } + +// uint256 operatorSharesBefore = strategyManager.stakerStrategyShares(address(this), stethStrategy); +// // check the expected output +// uint256 expectedSharesOut = stethStrategy.underlyingToShares(amountToDeposit); + +// underlyingToken.transfer(address(this), amountToDeposit); +// cheats.startPrank(address(this)); +// underlyingToken.approve(address(strategyManager), type(uint256).max); +// strategyManager.depositIntoStrategy(stethStrategy, underlyingToken, amountToDeposit); + +// //check if depositor has never used this strat, that it is added correctly to stakerStrategyList array. +// if (operatorSharesBefore == 0) { +// // check that strategy is appropriately added to dynamic array of all of sender's strategies +// assertTrue( +// strategyManager.stakerStrategyList(address(this), strategyManager.stakerStrategyListLength(address(this)) - 1) +// == stethStrategy, +// "_testDepositToStrategy: stakerStrategyList array updated incorrectly" +// ); +// } - // check that the shares out match the expected amount out - // the actual transfer in will be lower by 1-2 wei than expected due to stETH's internal rounding - // to account for this we check approximate rather than strict equivalence here - { - uint256 actualSharesOut = strategyManager.stakerStrategyShares(address(this), stethStrategy) - operatorSharesBefore; - require(actualSharesOut >= expectedSharesOut, "too few shares"); - require((actualSharesOut * 1000) / expectedSharesOut < 1003, "too many shares"); - - // additional sanity check for deposit not increasing in value - require(stethStrategy.sharesToUnderlying(actualSharesOut) <= amountToDeposit, "value cannot have increased"); - // slippage check - require((stethStrategy.sharesToUnderlying(actualSharesOut) * 1e6) / amountToDeposit >= (1e6 - 1), "bad slippage on first deposit"); - } - cheats.stopPrank(); - } - - function _whitelistStrategy(StrategyManager _strategyManager, StrategyBase _strategyBase) internal returns(StrategyManager) { - // whitelist the strategy for deposit - cheats.startPrank(strategyManager.strategyWhitelister()); - IStrategy[] memory _strategy = new IStrategy[](1); - bool[] memory _thirdPartyTransfersForbiddenValues = new bool[](1); - _strategy[0] = IStrategy(_strategyBase); - _strategyManager.addStrategiesToDepositWhitelist(_strategy, _thirdPartyTransfersForbiddenValues); - cheats.stopPrank(); - - return _strategyManager; - } -} +// // check that the shares out match the expected amount out +// // the actual transfer in will be lower by 1-2 wei than expected due to stETH's internal rounding +// // to account for this we check approximate rather than strict equivalence here +// { +// uint256 actualSharesOut = strategyManager.stakerStrategyShares(address(this), stethStrategy) - operatorSharesBefore; +// require(actualSharesOut >= expectedSharesOut, "too few shares"); +// require((actualSharesOut * 1000) / expectedSharesOut < 1003, "too many shares"); + +// // additional sanity check for deposit not increasing in value +// require(stethStrategy.sharesToUnderlying(actualSharesOut) <= amountToDeposit, "value cannot have increased"); +// // slippage check +// require((stethStrategy.sharesToUnderlying(actualSharesOut) * 1e6) / amountToDeposit >= (1e6 - 1), "bad slippage on first deposit"); +// } +// cheats.stopPrank(); +// } + +// function _whitelistStrategy(StrategyManager _strategyManager, StrategyBase _strategyBase) internal returns(StrategyManager) { +// // whitelist the strategy for deposit +// cheats.startPrank(strategyManager.strategyWhitelister()); +// IStrategy[] memory _strategy = new IStrategy[](1); +// bool[] memory _thirdPartyTransfersForbiddenValues = new bool[](1); +// _strategy[0] = IStrategy(_strategyBase); +// _strategyManager.addStrategiesToDepositWhitelist(_strategy, _thirdPartyTransfersForbiddenValues); +// cheats.stopPrank(); + +// return _strategyManager; +// } +// } \ No newline at end of file diff --git a/src/test/EigenLayerDeployer.t.sol b/src/test/EigenLayerDeployer.t.sol index 0f4888fc5..09989bde8 100644 --- a/src/test/EigenLayerDeployer.t.sol +++ b/src/test/EigenLayerDeployer.t.sol @@ -1,272 +1,279 @@ // SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.12; - -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 "../contracts/interfaces/IDelegationManager.sol"; -import "../contracts/core/DelegationManager.sol"; - -import "../contracts/interfaces/IETHPOSDeposit.sol"; - -import "../contracts/core/StrategyManager.sol"; -import "../contracts/strategies/StrategyBase.sol"; -import "../contracts/core/Slasher.sol"; - -import "../contracts/pods/EigenPod.sol"; -import "../contracts/pods/EigenPodManager.sol"; - -import "../contracts/permissions/PauserRegistry.sol"; - -import "./utils/Operators.sol"; - -import "./mocks/LiquidStakingToken.sol"; -import "./mocks/EmptyContract.sol"; -import "./mocks/ETHDepositMock.sol"; - -import "forge-std/Test.sol"; - -contract EigenLayerDeployer is Operators { - Vm cheats = Vm(HEVM_ADDRESS); - - // EigenLayer contracts - ProxyAdmin public eigenLayerProxyAdmin; - PauserRegistry public eigenLayerPauserReg; - - Slasher public slasher; - DelegationManager public delegation; - StrategyManager public strategyManager; - EigenPodManager public eigenPodManager; - IEigenPod public pod; - IETHPOSDeposit public ethPOSDeposit; - IBeacon public eigenPodBeacon; - - // testing/mock contracts - IERC20 public eigenToken; - IERC20 public weth; - StrategyBase public wethStrat; - StrategyBase public eigenStrat; - StrategyBase public baseStrategyImplementation; - EmptyContract public emptyContract; - - mapping(uint256 => IStrategy) public strategies; - - //from testing seed phrase - bytes32 priv_key_0 = 0x1234567812345678123456781234567812345678123456781234567812345678; - bytes32 priv_key_1 = 0x1234567812345678123456781234567812345698123456781234567812348976; - - //strategy indexes for undelegation (see commitUndelegation function) - uint256[] public strategyIndexes; - address[2] public stakers; - address sample_registrant = cheats.addr(436364636); - - address[] public slashingContracts; - - uint256 wethInitialSupply = 10e50; - uint256 public constant eigenTotalSupply = 1000e18; - uint256 nonce = 69; - uint256 public gasLimit = 750000; - IStrategy[] public initializeStrategiesToSetDelayBlocks; - uint256[] public initializeWithdrawalDelayBlocks; - uint256 minWithdrawalDelayBlocks = 0; - uint32 PARTIAL_WITHDRAWAL_FRAUD_PROOF_PERIOD_BLOCKS = 7 days / 12 seconds; - uint256 REQUIRED_BALANCE_WEI = 32 ether; - uint64 MAX_PARTIAL_WTIHDRAWAL_AMOUNT_GWEI = 1 ether / 1e9; - uint64 GOERLI_GENESIS_TIME = 1616508000; - - address pauser; - address unpauser; - address theMultiSig = address(420); - address operator = address(0x4206904396bF2f8b173350ADdEc5007A52664293); //sk: e88d9d864d5d731226020c5d2f02b62a4ce2a4534a39c225d32d3db795f83319 - address acct_0 = cheats.addr(uint256(priv_key_0)); - address acct_1 = cheats.addr(uint256(priv_key_1)); - address _challenger = address(0x6966904396bF2f8b173350bCcec5007A52669873); - address public eigenLayerReputedMultisig = address(this); - - address eigenLayerProxyAdminAddress; - address eigenLayerPauserRegAddress; - address slasherAddress; - address delegationAddress; - address strategyManagerAddress; - address eigenPodManagerAddress; - address podAddress; - address eigenPodBeaconAddress; - address emptyContractAddress; - address operationsMultisig; - address executorMultisig; - - - // addresses excluded from fuzzing due to abnormal behavior. TODO: @Sidu28 define this better and give it a clearer name - mapping(address => bool) fuzzedAddressMapping; - - //ensures that a passed in address is not set to true in the fuzzedAddressMapping - modifier fuzzedAddress(address addr) virtual { - cheats.assume(fuzzedAddressMapping[addr] == false); - _; - } - - modifier cannotReinit() { - cheats.expectRevert(bytes("Initializable: contract is already initialized")); - _; - } - - //performs basic deployment before each test - function setUp() public virtual { - try vm.envUint("CHAIN_ID") returns (uint256 chainId) { - if (chainId == 31337) { - _deployEigenLayerContractsLocal(); - } - // If CHAIN_ID ENV is not set, assume local deployment on 31337 - } catch { - _deployEigenLayerContractsLocal(); - } - - fuzzedAddressMapping[address(0)] = true; - fuzzedAddressMapping[address(eigenLayerProxyAdmin)] = true; - fuzzedAddressMapping[address(strategyManager)] = true; - fuzzedAddressMapping[address(eigenPodManager)] = true; - fuzzedAddressMapping[address(delegation)] = true; - fuzzedAddressMapping[address(slasher)] = true; - } - - function _deployEigenLayerContractsLocal() internal { - pauser = address(69); - unpauser = address(489); - // deploy proxy admin for ability to upgrade proxy contracts - eigenLayerProxyAdmin = new ProxyAdmin(); - - //deploy pauser registry - address[] memory pausers = new address[](1); - pausers[0] = pauser; - eigenLayerPauserReg = new PauserRegistry(pausers, unpauser); - - /** - * 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. - */ - emptyContract = new EmptyContract(); - delegation = DelegationManager( - address(new TransparentUpgradeableProxy(address(emptyContract), address(eigenLayerProxyAdmin), "")) - ); - strategyManager = StrategyManager( - address(new TransparentUpgradeableProxy(address(emptyContract), address(eigenLayerProxyAdmin), "")) - ); - slasher = Slasher( - address(new TransparentUpgradeableProxy(address(emptyContract), address(eigenLayerProxyAdmin), "")) - ); - eigenPodManager = EigenPodManager( - address(new TransparentUpgradeableProxy(address(emptyContract), address(eigenLayerProxyAdmin), "")) - ); - ethPOSDeposit = new ETHPOSDepositMock(); - pod = new EigenPod( - ethPOSDeposit, - eigenPodManager, - GOERLI_GENESIS_TIME - ); - - eigenPodBeacon = new UpgradeableBeacon(address(pod)); - - // Second, deploy the *implementation* contracts, using the *proxy contracts* as inputs - DelegationManager delegationImplementation = new DelegationManager(strategyManager, slasher, eigenPodManager); - StrategyManager strategyManagerImplementation = new StrategyManager(delegation, eigenPodManager, slasher); - Slasher slasherImplementation = new Slasher(strategyManager, delegation); - EigenPodManager eigenPodManagerImplementation = new EigenPodManager( - ethPOSDeposit, - eigenPodBeacon, - strategyManager, - slasher, - delegation - ); - - // Third, upgrade the proxy contracts to use the correct implementation contracts and initialize them. - eigenLayerProxyAdmin.upgradeAndCall( - TransparentUpgradeableProxy(payable(address(delegation))), - address(delegationImplementation), - abi.encodeWithSelector( - DelegationManager.initialize.selector, - eigenLayerReputedMultisig, - eigenLayerPauserReg, - 0 /*initialPausedStatus*/, - minWithdrawalDelayBlocks, - initializeStrategiesToSetDelayBlocks, - initializeWithdrawalDelayBlocks - ) - ); - eigenLayerProxyAdmin.upgradeAndCall( - TransparentUpgradeableProxy(payable(address(strategyManager))), - address(strategyManagerImplementation), - abi.encodeWithSelector( - StrategyManager.initialize.selector, - eigenLayerReputedMultisig, - eigenLayerReputedMultisig, - eigenLayerPauserReg, - 0 /*initialPausedStatus*/ - ) - ); - eigenLayerProxyAdmin.upgradeAndCall( - TransparentUpgradeableProxy(payable(address(slasher))), - address(slasherImplementation), - abi.encodeWithSelector( - Slasher.initialize.selector, - eigenLayerReputedMultisig, - eigenLayerPauserReg, - 0 /*initialPausedStatus*/ - ) - ); - eigenLayerProxyAdmin.upgradeAndCall( - TransparentUpgradeableProxy(payable(address(eigenPodManager))), - address(eigenPodManagerImplementation), - abi.encodeWithSelector( - EigenPodManager.initialize.selector, - eigenLayerReputedMultisig, - eigenLayerPauserReg, - 0 /*initialPausedStatus*/ - ) - ); - - //simple ERC20 (**NOT** WETH-like!), used in a test strategy - weth = new ERC20PresetFixedSupply("weth", "WETH", wethInitialSupply, address(this)); - - // deploy StrategyBase contract implementation, then create upgradeable proxy that points to implementation and initialize it - baseStrategyImplementation = new StrategyBase(strategyManager); - wethStrat = StrategyBase( - address( - new TransparentUpgradeableProxy( - address(baseStrategyImplementation), - address(eigenLayerProxyAdmin), - abi.encodeWithSelector(StrategyBase.initialize.selector, weth, eigenLayerPauserReg) - ) - ) - ); - - eigenToken = new ERC20PresetFixedSupply("eigen", "EIGEN", wethInitialSupply, address(this)); - - // deploy upgradeable proxy that points to StrategyBase implementation and initialize it - eigenStrat = StrategyBase( - address( - new TransparentUpgradeableProxy( - address(baseStrategyImplementation), - address(eigenLayerProxyAdmin), - abi.encodeWithSelector(StrategyBase.initialize.selector, eigenToken, eigenLayerPauserReg) - ) - ) - ); - - stakers = [acct_0, acct_1]; - } - - function _setAddresses(string memory config) internal { - eigenLayerProxyAdminAddress = stdJson.readAddress(config, ".addresses.eigenLayerProxyAdmin"); - eigenLayerPauserRegAddress = stdJson.readAddress(config, ".addresses.eigenLayerPauserReg"); - delegationAddress = stdJson.readAddress(config, ".addresses.delegation"); - strategyManagerAddress = stdJson.readAddress(config, ".addresses.strategyManager"); - slasherAddress = stdJson.readAddress(config, ".addresses.slasher"); - eigenPodManagerAddress = stdJson.readAddress(config, ".addresses.eigenPodManager"); - emptyContractAddress = stdJson.readAddress(config, ".addresses.emptyContract"); - operationsMultisig = stdJson.readAddress(config, ".parameters.operationsMultisig"); - executorMultisig = stdJson.readAddress(config, ".parameters.executorMultisig"); - } -} +pragma solidity ^0.8.27; + +// 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 "../contracts/interfaces/IDelegationManager.sol"; +// import "../contracts/core/DelegationManager.sol"; +// import "../contracts/core/AVSDirectory.sol"; + +// import "../contracts/interfaces/IETHPOSDeposit.sol"; + +// import "../contracts/core/StrategyManager.sol"; +// import "../contracts/strategies/StrategyBase.sol"; +// import "../contracts/core/Slasher.sol"; + +// import "../contracts/pods/EigenPod.sol"; +// import "../contracts/pods/EigenPodManager.sol"; + +// import "../contracts/permissions/PauserRegistry.sol"; + +// import "./utils/Operators.sol"; + +// import "./mocks/LiquidStakingToken.sol"; +// import "./mocks/EmptyContract.sol"; +// import "./mocks/ETHDepositMock.sol"; + +// import "forge-std/Test.sol"; + +// contract EigenLayerDeployer is Operators { +// Vm cheats = Vm(HEVM_ADDRESS); + +// // EigenLayer contracts +// ProxyAdmin public eigenLayerProxyAdmin; +// PauserRegistry public eigenLayerPauserReg; + +// AVSDirectory public avsDirectory; +// Slasher public slasher; +// DelegationManager public delegation; +// StrategyManager public strategyManager; +// EigenPodManager public eigenPodManager; +// IEigenPod public pod; +// IETHPOSDeposit public ethPOSDeposit; +// IBeacon public eigenPodBeacon; + +// // testing/mock contracts +// IERC20 public eigenToken; +// IERC20 public weth; +// StrategyBase public wethStrat; +// StrategyBase public eigenStrat; +// StrategyBase public baseStrategyImplementation; +// EmptyContract public emptyContract; + +// mapping(uint256 => IStrategy) public strategies; + +// //from testing seed phrase +// bytes32 priv_key_0 = 0x1234567812345678123456781234567812345678123456781234567812345678; +// bytes32 priv_key_1 = 0x1234567812345678123456781234567812345698123456781234567812348976; + +// //strategy indexes for undelegation (see commitUndelegation function) +// uint256[] public strategyIndexes; +// address[2] public stakers; +// address sample_registrant = cheats.addr(436364636); + +// address[] public slashingContracts; + +// uint256 wethInitialSupply = 10e50; +// uint256 public constant eigenTotalSupply = 1000e18; +// uint256 nonce = 69; +// uint256 public gasLimit = 750000; +// IStrategy[] public initializeStrategiesToSetDelayBlocks; +// uint256[] public initializeWithdrawalDelayBlocks; +// uint256 minWithdrawalDelayBlocks = 0; +// uint32 PARTIAL_WITHDRAWAL_FRAUD_PROOF_PERIOD_BLOCKS = 7 days / 12 seconds; +// uint256 REQUIRED_BALANCE_WEI = 32 ether; +// uint64 MAX_PARTIAL_WTIHDRAWAL_AMOUNT_GWEI = 1 ether / 1e9; +// uint64 GOERLI_GENESIS_TIME = 1616508000; + +// address pauser; +// address unpauser; +// address theMultiSig = address(420); +// address operator = address(0x4206904396bF2f8b173350ADdEc5007A52664293); //sk: e88d9d864d5d731226020c5d2f02b62a4ce2a4534a39c225d32d3db795f83319 +// address acct_0 = cheats.addr(uint256(priv_key_0)); +// address acct_1 = cheats.addr(uint256(priv_key_1)); +// address _challenger = address(0x6966904396bF2f8b173350bCcec5007A52669873); +// address public eigenLayerReputedMultisig = address(this); + +// address eigenLayerProxyAdminAddress; +// address eigenLayerPauserRegAddress; +// address slasherAddress; +// address delegationAddress; +// address strategyManagerAddress; +// address eigenPodManagerAddress; +// address podAddress; +// address eigenPodBeaconAddress; +// address emptyContractAddress; +// address operationsMultisig; +// address executorMultisig; + + +// // addresses excluded from fuzzing due to abnormal behavior. TODO: @Sidu28 define this better and give it a clearer name +// mapping(address => bool) fuzzedAddressMapping; + +// //ensures that a passed in address is not set to true in the fuzzedAddressMapping +// modifier fuzzedAddress(address addr) virtual { +// cheats.assume(fuzzedAddressMapping[addr] == false); +// _; +// } + +// modifier cannotReinit() { +// cheats.expectRevert(bytes("Initializable: contract is already initialized")); +// _; +// } + +// //performs basic deployment before each test +// function setUp() public virtual { +// try vm.envUint("CHAIN_ID") returns (uint256 chainId) { +// if (chainId == 31337) { +// _deployEigenLayerContractsLocal(); +// } +// // If CHAIN_ID ENV is not set, assume local deployment on 31337 +// } catch { +// _deployEigenLayerContractsLocal(); +// } + +// fuzzedAddressMapping[address(0)] = true; +// fuzzedAddressMapping[address(eigenLayerProxyAdmin)] = true; +// fuzzedAddressMapping[address(strategyManager)] = true; +// fuzzedAddressMapping[address(eigenPodManager)] = true; +// fuzzedAddressMapping[address(delegation)] = true; +// fuzzedAddressMapping[address(slasher)] = true; +// fuzzedAddressMapping[address(avsDirectory)] = true; +// } + +// function _deployEigenLayerContractsLocal() internal { +// pauser = address(69); +// unpauser = address(489); +// // deploy proxy admin for ability to upgrade proxy contracts +// eigenLayerProxyAdmin = new ProxyAdmin(); + +// //deploy pauser registry +// address[] memory pausers = new address[](1); +// pausers[0] = pauser; +// eigenLayerPauserReg = new PauserRegistry(pausers, unpauser); + +// /** +// * 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. +// */ +// emptyContract = new EmptyContract(); +// avsDirectory = AVSDirectory( +// address(new TransparentUpgradeableProxy(address(emptyContract), address(eigenLayerProxyAdmin), "")) +// ); +// delegation = DelegationManager( +// address(new TransparentUpgradeableProxy(address(emptyContract), address(eigenLayerProxyAdmin), "")) +// ); +// strategyManager = StrategyManager( +// address(new TransparentUpgradeableProxy(address(emptyContract), address(eigenLayerProxyAdmin), "")) +// ); +// slasher = Slasher( +// address(new TransparentUpgradeableProxy(address(emptyContract), address(eigenLayerProxyAdmin), "")) +// ); +// eigenPodManager = EigenPodManager( +// address(new TransparentUpgradeableProxy(address(emptyContract), address(eigenLayerProxyAdmin), "")) +// ); +// ethPOSDeposit = new ETHPOSDepositMock(); +// pod = new EigenPod( +// ethPOSDeposit, +// eigenPodManager, +// GOERLI_GENESIS_TIME +// ); + +// eigenPodBeacon = new UpgradeableBeacon(address(pod)); + +// // Second, deploy the *implementation* contracts, using the *proxy contracts* as inputs +// AVSDirectory avsDirectoryImplementation = new AVSDirectory(delegation); +// DelegationManager delegationImplementation = new DelegationManager(strategyManager, slasher, eigenPodManager); +// StrategyManager strategyManagerImplementation = new StrategyManager(delegation, eigenPodManager, slasher, avsDirectory); +// Slasher slasherImplementation = new Slasher(strategyManager, delegation); +// EigenPodManager eigenPodManagerImplementation = new EigenPodManager( +// ethPOSDeposit, +// eigenPodBeacon, +// strategyManager, +// slasher, +// delegation +// ); + +// // Third, upgrade the proxy contracts to use the correct implementation contracts and initialize them. +// eigenLayerProxyAdmin.upgradeAndCall( +// TransparentUpgradeableProxy(payable(address(delegation))), +// address(delegationImplementation), +// abi.encodeWithSelector( +// DelegationManager.initialize.selector, +// eigenLayerReputedMultisig, +// eigenLayerPauserReg, +// 0 /*initialPausedStatus*/, +// minWithdrawalDelayBlocks, +// initializeStrategiesToSetDelayBlocks, +// initializeWithdrawalDelayBlocks +// ) +// ); +// eigenLayerProxyAdmin.upgradeAndCall( +// TransparentUpgradeableProxy(payable(address(strategyManager))), +// address(strategyManagerImplementation), +// abi.encodeWithSelector( +// StrategyManager.initialize.selector, +// eigenLayerReputedMultisig, +// eigenLayerReputedMultisig, +// eigenLayerPauserReg, +// 0 /*initialPausedStatus*/ +// ) +// ); +// eigenLayerProxyAdmin.upgradeAndCall( +// TransparentUpgradeableProxy(payable(address(slasher))), +// address(slasherImplementation), +// abi.encodeWithSelector( +// Slasher.initialize.selector, +// eigenLayerReputedMultisig, +// eigenLayerPauserReg, +// 0 /*initialPausedStatus*/ +// ) +// ); +// eigenLayerProxyAdmin.upgradeAndCall( +// TransparentUpgradeableProxy(payable(address(eigenPodManager))), +// address(eigenPodManagerImplementation), +// abi.encodeWithSelector( +// EigenPodManager.initialize.selector, +// eigenLayerReputedMultisig, +// eigenLayerPauserReg, +// 0 /*initialPausedStatus*/ +// ) +// ); + +// //simple ERC20 (**NOT** WETH-like!), used in a test strategy +// weth = new ERC20PresetFixedSupply("weth", "WETH", wethInitialSupply, address(this)); + +// // deploy StrategyBase contract implementation, then create upgradeable proxy that points to implementation and initialize it +// baseStrategyImplementation = new StrategyBase(strategyManager); +// wethStrat = StrategyBase( +// address( +// new TransparentUpgradeableProxy( +// address(baseStrategyImplementation), +// address(eigenLayerProxyAdmin), +// abi.encodeWithSelector(StrategyBase.initialize.selector, weth, eigenLayerPauserReg) +// ) +// ) +// ); + +// eigenToken = new ERC20PresetFixedSupply("eigen", "EIGEN", wethInitialSupply, address(this)); + +// // deploy upgradeable proxy that points to StrategyBase implementation and initialize it +// eigenStrat = StrategyBase( +// address( +// new TransparentUpgradeableProxy( +// address(baseStrategyImplementation), +// address(eigenLayerProxyAdmin), +// abi.encodeWithSelector(StrategyBase.initialize.selector, eigenToken, eigenLayerPauserReg) +// ) +// ) +// ); + +// stakers = [acct_0, acct_1]; +// } + +// function _setAddresses(string memory config) internal { +// eigenLayerProxyAdminAddress = stdJson.readAddress(config, ".addresses.eigenLayerProxyAdmin"); +// eigenLayerPauserRegAddress = stdJson.readAddress(config, ".addresses.eigenLayerPauserReg"); +// delegationAddress = stdJson.readAddress(config, ".addresses.delegation"); +// strategyManagerAddress = stdJson.readAddress(config, ".addresses.strategyManager"); +// slasherAddress = stdJson.readAddress(config, ".addresses.slasher"); +// eigenPodManagerAddress = stdJson.readAddress(config, ".addresses.eigenPodManager"); +// emptyContractAddress = stdJson.readAddress(config, ".addresses.emptyContract"); +// operationsMultisig = stdJson.readAddress(config, ".parameters.operationsMultisig"); +// executorMultisig = stdJson.readAddress(config, ".parameters.executorMultisig"); +// } +// } \ No newline at end of file diff --git a/src/test/EigenLayerTestHelper.t.sol b/src/test/EigenLayerTestHelper.t.sol index 62508d5d8..56d37a675 100644 --- a/src/test/EigenLayerTestHelper.t.sol +++ b/src/test/EigenLayerTestHelper.t.sol @@ -1,505 +1,505 @@ // SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.12; - -import "../test/EigenLayerDeployer.t.sol"; -import "../contracts/interfaces/ISignatureUtils.sol"; - -contract EigenLayerTestHelper is EigenLayerDeployer { - uint8 durationToInit = 2; - uint256 public SECP256K1N_MODULUS = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141; - uint256 public SECP256K1N_MODULUS_HALF = 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0; - - uint256[] sharesBefore; - uint256[] balanceBefore; - uint256[] priorTotalShares; - uint256[] strategyTokenBalance; - - /** - * @notice Helper function to test `initiateDelegation` functionality. Handles registering as an operator, depositing tokens - * into both Weth and Eigen strategies, as well as delegating assets from "stakers" to the operator. - * @param operatorIndex is the index of the operator to use from the test-data/operators.json file - * @param amountEigenToDeposit amount of eigen token to deposit - * @param amountEthToDeposit amount of eth to deposit - */ - - function _testInitiateDelegation( - uint8 operatorIndex, - uint256 amountEigenToDeposit, - uint256 amountEthToDeposit - ) public returns (uint256 amountEthStaked, uint256 amountEigenStaked) { - address operator = getOperatorAddress(operatorIndex); - - //setting up operator's delegation terms - IDelegationManager.OperatorDetails memory operatorDetails = IDelegationManager.OperatorDetails({ - __deprecated_earningsReceiver: operator, - delegationApprover: address(0), - stakerOptOutWindowBlocks: 0 - }); - _testRegisterAsOperator(operator, operatorDetails); - - for (uint256 i; i < stakers.length; i++) { - //initialize weth, eigen and eth balances for staker - eigenToken.transfer(stakers[i], amountEigenToDeposit); - weth.transfer(stakers[i], amountEthToDeposit); - - //deposit staker's eigen and weth into strategy manager - _testDepositEigen(stakers[i], amountEigenToDeposit); - _testDepositWeth(stakers[i], amountEthToDeposit); - - //delegate the staker's deposits to operator - uint256 operatorEigenSharesBefore = delegation.operatorShares(operator, eigenStrat); - uint256 operatorWETHSharesBefore = delegation.operatorShares(operator, wethStrat); - _testDelegateToOperator(stakers[i], operator); - //verify that `increaseOperatorShares` worked - assertTrue( - delegation.operatorShares(operator, eigenStrat) - operatorEigenSharesBefore == amountEigenToDeposit - ); - assertTrue(delegation.operatorShares(operator, wethStrat) - operatorWETHSharesBefore == amountEthToDeposit); - } - amountEthStaked += delegation.operatorShares(operator, wethStrat); - amountEigenStaked += delegation.operatorShares(operator, eigenStrat); - - return (amountEthStaked, amountEigenStaked); - } - - /** - * @notice Register 'sender' as an operator, setting their 'OperatorDetails' in DelegationManager to 'operatorDetails', verifies - * that the storage of DelegationManager contract is updated appropriately - * - * @param sender is the address being registered as an operator - * @param operatorDetails is the `sender`'s OperatorDetails struct - */ - function _testRegisterAsOperator( - address sender, - IDelegationManager.OperatorDetails memory operatorDetails - ) internal { - cheats.startPrank(sender); - string memory emptyStringForMetadataURI; - delegation.registerAsOperator(operatorDetails, emptyStringForMetadataURI); - assertTrue(delegation.isOperator(sender), "testRegisterAsOperator: sender is not a operator"); - - assertTrue( - keccak256(abi.encode(delegation.operatorDetails(sender))) == keccak256(abi.encode(operatorDetails)), - "_testRegisterAsOperator: operatorDetails not set appropriately" - ); - - assertTrue(delegation.isDelegated(sender), "_testRegisterAsOperator: sender not marked as actively delegated"); - cheats.stopPrank(); - } - - /** - * @notice Deposits `amountToDeposit` of WETH from address `sender` into `wethStrat`. - * @param sender The address to spoof calls from using `cheats.startPrank(sender)` - * @param amountToDeposit Amount of WETH that is first *transferred from this contract to `sender`* and then deposited by `sender` into `stratToDepositTo` - */ - function _testDepositWeth(address sender, uint256 amountToDeposit) internal returns (uint256 amountDeposited) { - cheats.assume(amountToDeposit <= wethInitialSupply); - amountDeposited = _testDepositToStrategy(sender, amountToDeposit, weth, wethStrat); - } - - /** - * @notice Deposits `amountToDeposit` of EIGEN from address `sender` into `eigenStrat`. - * @param sender The address to spoof calls from using `cheats.startPrank(sender)` - * @param amountToDeposit Amount of EIGEN that is first *transferred from this contract to `sender`* and then deposited by `sender` into `stratToDepositTo` - */ - function _testDepositEigen(address sender, uint256 amountToDeposit) internal returns (uint256 amountDeposited) { - cheats.assume(amountToDeposit <= eigenTotalSupply); - amountDeposited = _testDepositToStrategy(sender, amountToDeposit, eigenToken, eigenStrat); - } - - /** - * @notice Deposits `amountToDeposit` of `underlyingToken` from address `sender` into `stratToDepositTo`. - * *If* `sender` has zero shares prior to deposit, *then* checks that `stratToDepositTo` is correctly added to their `stakerStrategyList` array. - * - * @param sender The address to spoof calls from using `cheats.startPrank(sender)` - * @param amountToDeposit Amount of WETH that is first *transferred from this contract to `sender`* and then deposited by `sender` into `stratToDepositTo` - */ - function _testDepositToStrategy( - address sender, - uint256 amountToDeposit, - IERC20 underlyingToken, - IStrategy stratToDepositTo - ) internal returns (uint256 amountDeposited) { - // deposits will revert when amountToDeposit is 0 - cheats.assume(amountToDeposit > 0); - - // whitelist the strategy for deposit, in case it wasn't before - { - cheats.startPrank(strategyManager.strategyWhitelister()); - IStrategy[] memory _strategy = new IStrategy[](1); - bool[] memory _thirdPartyTransfersForbiddenValues = new bool[](1); - _strategy[0] = stratToDepositTo; - strategyManager.addStrategiesToDepositWhitelist(_strategy, _thirdPartyTransfersForbiddenValues); - cheats.stopPrank(); - } - - uint256 operatorSharesBefore = strategyManager.stakerStrategyShares(sender, stratToDepositTo); - // assumes this contract already has the underlying token! - uint256 contractBalance = underlyingToken.balanceOf(address(this)); - // check the expected output - uint256 expectedSharesOut = stratToDepositTo.underlyingToShares(amountToDeposit); - // logging and error for misusing this function (see assumption above) - if (amountToDeposit > contractBalance) { - emit log("amountToDeposit > contractBalance"); - emit log_named_uint("amountToDeposit is", amountToDeposit); - emit log_named_uint("while contractBalance is", contractBalance); - revert("_testDepositToStrategy failure"); - } else { - underlyingToken.transfer(sender, amountToDeposit); - cheats.startPrank(sender); - underlyingToken.approve(address(strategyManager), type(uint256).max); - strategyManager.depositIntoStrategy(stratToDepositTo, underlyingToken, amountToDeposit); - amountDeposited = amountToDeposit; - - //check if depositor has never used this strat, that it is added correctly to stakerStrategyList array. - if (operatorSharesBefore == 0) { - // check that strategy is appropriately added to dynamic array of all of sender's strategies - assertTrue( - strategyManager.stakerStrategyList(sender, strategyManager.stakerStrategyListLength(sender) - 1) == - stratToDepositTo, - "_testDepositToStrategy: stakerStrategyList array updated incorrectly" - ); - } - - // check that the shares out match the expected amount out - assertEq( - strategyManager.stakerStrategyShares(sender, stratToDepositTo) - operatorSharesBefore, - expectedSharesOut, - "_testDepositToStrategy: actual shares out should match expected shares out" - ); - } - cheats.stopPrank(); - } - - /** - * @notice tries to delegate from 'staker' to 'operator', verifies that staker has at least some shares - * delegatedShares update correctly for 'operator' and delegated status is updated correctly for 'staker' - * @param staker the staker address to delegate from - * @param operator the operator address to delegate to - */ - function _testDelegateToOperator(address staker, address operator) internal { - //staker-specific information - (IStrategy[] memory delegateStrategies, uint256[] memory delegateShares) = strategyManager.getDeposits(staker); - - uint256 numStrats = delegateShares.length; - assertTrue(numStrats != 0, "_testDelegateToOperator: delegating from address with no deposits"); - uint256[] memory inititalSharesInStrats = new uint256[](numStrats); - for (uint256 i = 0; i < numStrats; ++i) { - inititalSharesInStrats[i] = delegation.operatorShares(operator, delegateStrategies[i]); - } - - cheats.startPrank(staker); - ISignatureUtils.SignatureWithExpiry memory signatureWithExpiry; - delegation.delegateTo(operator, signatureWithExpiry, bytes32(0)); - cheats.stopPrank(); - - assertTrue( - delegation.delegatedTo(staker) == operator, - "_testDelegateToOperator: delegated address not set appropriately" - ); - assertTrue(delegation.isDelegated(staker), "_testDelegateToOperator: delegated status not set appropriately"); - - for (uint256 i = 0; i < numStrats; ++i) { - uint256 operatorSharesBefore = inititalSharesInStrats[i]; - uint256 operatorSharesAfter = delegation.operatorShares(operator, delegateStrategies[i]); - assertTrue( - operatorSharesAfter == (operatorSharesBefore + delegateShares[i]), - "_testDelegateToOperator: delegatedShares not increased correctly" - ); - } - } - - /** - * @notice deploys 'numStratsToAdd' strategies contracts and initializes them to treat `underlyingToken` as their underlying token - * and then deposits 'amountToDeposit' to each of them from 'sender' - * - * @param sender address that is depositing into the strategies - * @param amountToDeposit amount being deposited - * @param numStratsToAdd number of strategies that are being deployed and deposited into - */ - function _testDepositStrategies(address sender, uint256 amountToDeposit, uint8 numStratsToAdd) internal { - // hard-coded input - IERC20 underlyingToken = weth; - - cheats.assume(numStratsToAdd > 0 && numStratsToAdd <= 20); - IStrategy[] memory stratsToDepositTo = new IStrategy[](numStratsToAdd); - for (uint8 i = 0; i < numStratsToAdd; ++i) { - stratsToDepositTo[i] = StrategyBase( - address( - new TransparentUpgradeableProxy( - address(baseStrategyImplementation), - address(eigenLayerProxyAdmin), - abi.encodeWithSelector(StrategyBase.initialize.selector, underlyingToken, eigenLayerPauserReg) - ) - ) - ); - _testDepositToStrategy(sender, amountToDeposit, weth, StrategyBase(address(stratsToDepositTo[i]))); - } - for (uint8 i = 0; i < numStratsToAdd; ++i) { - // check that strategy is appropriately added to dynamic array of all of sender's strategies - assertTrue( - strategyManager.stakerStrategyList(sender, i) == stratsToDepositTo[i], - "stakerStrategyList array updated incorrectly" - ); - - // TODO: perhaps remove this is we can. seems brittle if we don't track the number of strategies somewhere - //store strategy in mapping of strategies - strategies[i] = IStrategy(address(stratsToDepositTo[i])); - } - } - - /** - * @notice Creates a queued withdrawal from `staker`. Begins by registering the staker as a delegate (if specified), then deposits `amountToDeposit` - * into the WETH strategy, and then queues a withdrawal using - * `strategyManager.queueWithdrawal(strategyIndexes, strategyArray, tokensArray, shareAmounts, withdrawer)` - * @notice After initiating a queued withdrawal, this test checks that `strategyManager.canCompleteQueuedWithdrawal` immediately returns the correct - * response depending on whether `staker` is delegated or not. - * @param staker The address to initiate the queued withdrawal - * @param registerAsOperator If true, `staker` will also register as a delegate in the course of this function - * @param amountToDeposit The amount of WETH to deposit - */ - function _createQueuedWithdrawal( - address staker, - bool registerAsOperator, - uint256 amountToDeposit, - IStrategy[] memory strategyArray, - uint256[] memory shareAmounts, - uint256[] memory strategyIndexes, - address withdrawer - ) internal returns (bytes32 withdrawalRoot, IDelegationManager.Withdrawal memory queuedWithdrawal) { - require(amountToDeposit >= shareAmounts[0], "_createQueuedWithdrawal: sanity check failed"); - - // we do this here to ensure that `staker` is delegated if `registerAsOperator` is true - if (registerAsOperator) { - assertTrue(!delegation.isDelegated(staker), "_createQueuedWithdrawal: staker is already delegated"); - IDelegationManager.OperatorDetails memory operatorDetails = IDelegationManager.OperatorDetails({ - __deprecated_earningsReceiver: staker, - delegationApprover: address(0), - stakerOptOutWindowBlocks: 0 - }); - _testRegisterAsOperator(staker, operatorDetails); - assertTrue( - delegation.isDelegated(staker), - "_createQueuedWithdrawal: staker isn't delegated when they should be" - ); - } - - queuedWithdrawal = IDelegationManager.Withdrawal({ - strategies: strategyArray, - shares: shareAmounts, - staker: staker, - withdrawer: withdrawer, - nonce: delegation.cumulativeWithdrawalsQueued(staker), - delegatedTo: delegation.delegatedTo(staker), - startBlock: uint32(block.number) - }); - - { - //make deposit in WETH strategy - uint256 amountDeposited = _testDepositWeth(staker, amountToDeposit); - // We can't withdraw more than we deposit - if (shareAmounts[0] > amountDeposited) { - cheats.expectRevert("StrategyManager._removeShares: shareAmount too high"); - } - } - - //queue the withdrawal - withdrawalRoot = _testQueueWithdrawal(staker, strategyIndexes, strategyArray, shareAmounts, withdrawer); - return (withdrawalRoot, queuedWithdrawal); - } - - /** - * Helper for ECDSA signatures: combines V and S into VS - if S is greater than SECP256K1N_MODULUS_HALF, then we - * get the modulus, so that the leading bit of s is always 0. Then we set the leading - * bit to be either 0 or 1 based on the value of v, which is either 27 or 28 - */ - function getVSfromVandS(uint8 v, bytes32 s) internal view returns (bytes32) { - if (uint256(s) > SECP256K1N_MODULUS_HALF) { - s = bytes32(SECP256K1N_MODULUS - uint256(s)); - } - - bytes32 vs = s; - if (v == 28) { - vs = bytes32(uint256(s) ^ (1 << 255)); - } - - return vs; - } - - /// @notice registers a fixed address as an operator, delegates to it from a second address, - /// and checks that the operator's voteWeights increase properly - /// @param operator is the operator being delegated to. - /// @param staker is the staker delegating stake to the operator. - /// @param ethAmount is the amount of ETH to deposit into the operator's strategy. - /// @param eigenAmount is the amount of EIGEN to deposit into the operator's strategy. - function _testDelegation( - address operator, - address staker, - uint256 ethAmount, - uint256 eigenAmount - ) internal { - if (!delegation.isOperator(operator)) { - IDelegationManager.OperatorDetails memory operatorDetails = IDelegationManager.OperatorDetails({ - __deprecated_earningsReceiver: operator, - delegationApprover: address(0), - stakerOptOutWindowBlocks: 0 - }); - _testRegisterAsOperator(operator, operatorDetails); - } - - uint256 amountBefore = delegation.operatorShares(operator, wethStrat); - - //making additional deposits to the strategies - assertTrue(!delegation.isDelegated(staker) == true, "testDelegation: staker is not delegate"); - _testDepositWeth(staker, ethAmount); - _testDepositEigen(staker, eigenAmount); - _testDelegateToOperator(staker, operator); - assertTrue(delegation.isDelegated(staker) == true, "testDelegation: staker is not delegate"); - - (/*IStrategy[] memory updatedStrategies*/, uint256[] memory updatedShares) = strategyManager.getDeposits(staker); - - IStrategy _strat = wethStrat; - // IStrategy _strat = strategyManager.stakerStrategyList(staker, 0); - assertTrue(address(_strat) != address(0), "stakerStrategyList not updated correctly"); - - assertTrue( - delegation.operatorShares(operator, _strat) - updatedShares[0] == amountBefore, - "ETH operatorShares not updated correctly" - ); - } - - /** - * @notice Helper function to complete an existing queued withdrawal in shares - * @param depositor is the address of the staker who queued a withdrawal - * @param strategyArray is the array of strategies to withdraw from - * @param tokensArray is the array of tokens to withdraw from said strategies - * @param shareAmounts is the array of shares to be withdrawn from said strategies - * @param delegatedTo is the address the staker has delegated their shares to - * @param withdrawalStartBlock the block number of the original queued withdrawal - * @param middlewareTimesIndex index in the middlewareTimes array used to queue this withdrawal - */ - - function _testCompleteQueuedWithdrawalShares( - address depositor, - IStrategy[] memory strategyArray, - IERC20[] memory tokensArray, - uint256[] memory shareAmounts, - address delegatedTo, - address withdrawer, - uint256 nonce, - uint32 withdrawalStartBlock, - uint256 middlewareTimesIndex - ) internal { - cheats.startPrank(withdrawer); - - for (uint256 i = 0; i < strategyArray.length; i++) { - sharesBefore.push(strategyManager.stakerStrategyShares(withdrawer, strategyArray[i])); - } - // emit log_named_uint("strategies", strategyArray.length); - // emit log_named_uint("tokens", tokensArray.length); - // emit log_named_uint("shares", shareAmounts.length); - // emit log_named_address("depositor", depositor); - // emit log_named_uint("withdrawalStartBlock", withdrawalStartBlock); - // emit log_named_address("delegatedAddress", delegatedTo); - // emit log("************************************************************************************************"); - - IDelegationManager.Withdrawal memory queuedWithdrawal = IDelegationManager.Withdrawal({ - strategies: strategyArray, - shares: shareAmounts, - staker: depositor, - withdrawer: withdrawer, - nonce: nonce, - startBlock: withdrawalStartBlock, - delegatedTo: delegatedTo - }); - - // complete the queued withdrawal - delegation.completeQueuedWithdrawal(queuedWithdrawal, tokensArray, middlewareTimesIndex, false); - - for (uint256 i = 0; i < strategyArray.length; i++) { - require( - strategyManager.stakerStrategyShares(withdrawer, strategyArray[i]) == sharesBefore[i] + shareAmounts[i], - "_testCompleteQueuedWithdrawalShares: withdrawer shares not incremented" - ); - } - cheats.stopPrank(); - } - - /** - * @notice Helper function to complete an existing queued withdrawal in tokens - * @param depositor is the address of the staker who queued a withdrawal - * @param strategyArray is the array of strategies to withdraw from - * @param tokensArray is the array of tokens to withdraw from said strategies - * @param shareAmounts is the array of shares to be withdrawn from said strategies - * @param delegatedTo is the address the staker has delegated their shares to - * @param withdrawalStartBlock the block number of the original queued withdrawal - * @param middlewareTimesIndex index in the middlewareTimes array used to queue this withdrawal - */ - function _testCompleteQueuedWithdrawalTokens( - address depositor, - IStrategy[] memory strategyArray, - IERC20[] memory tokensArray, - uint256[] memory shareAmounts, - address delegatedTo, - address withdrawer, - uint256 nonce, - uint32 withdrawalStartBlock, - uint256 middlewareTimesIndex - ) internal { - cheats.startPrank(withdrawer); - - for (uint256 i = 0; i < strategyArray.length; i++) { - balanceBefore.push(strategyArray[i].underlyingToken().balanceOf(withdrawer)); - priorTotalShares.push(strategyArray[i].totalShares()); - strategyTokenBalance.push(strategyArray[i].underlyingToken().balanceOf(address(strategyArray[i]))); - } - - IDelegationManager.Withdrawal memory queuedWithdrawal = IDelegationManager.Withdrawal({ - strategies: strategyArray, - shares: shareAmounts, - staker: depositor, - withdrawer: withdrawer, - nonce: nonce, - startBlock: withdrawalStartBlock, - delegatedTo: delegatedTo - }); - // complete the queued withdrawal - delegation.completeQueuedWithdrawal(queuedWithdrawal, tokensArray, middlewareTimesIndex, true); - - for (uint256 i = 0; i < strategyArray.length; i++) { - //uint256 strategyTokenBalance = strategyArray[i].underlyingToken().balanceOf(address(strategyArray[i])); - uint256 tokenBalanceDelta = (strategyTokenBalance[i] * shareAmounts[i]) / priorTotalShares[i]; - - // filter out unrealistic case, where the withdrawer is the strategy contract itself - cheats.assume(withdrawer != address(strategyArray[i])); - require( - strategyArray[i].underlyingToken().balanceOf(withdrawer) == balanceBefore[i] + tokenBalanceDelta, - "_testCompleteQueuedWithdrawalTokens: withdrawer balance not incremented" - ); - } - cheats.stopPrank(); - } - - function _testQueueWithdrawal( - address depositor, - uint256[] memory /*strategyIndexes*/, - IStrategy[] memory strategyArray, - uint256[] memory shareAmounts, - address withdrawer - ) internal returns (bytes32) { - cheats.startPrank(depositor); - - IDelegationManager.QueuedWithdrawalParams[] memory params = new IDelegationManager.QueuedWithdrawalParams[](1); - - params[0] = IDelegationManager.QueuedWithdrawalParams({ - strategies: strategyArray, - shares: shareAmounts, - withdrawer: withdrawer - }); - - bytes32[] memory withdrawalRoots = new bytes32[](1); - withdrawalRoots = delegation.queueWithdrawals(params); - cheats.stopPrank(); - return withdrawalRoots[0]; - } -} +pragma solidity ^0.8.27; + +// import "../test/EigenLayerDeployer.t.sol"; +// import "../contracts/interfaces/ISignatureUtils.sol"; + +// contract EigenLayerTestHelper is EigenLayerDeployer { +// uint8 durationToInit = 2; +// uint256 public SECP256K1N_MODULUS = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141; +// uint256 public SECP256K1N_MODULUS_HALF = 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0; + +// uint256[] sharesBefore; +// uint256[] balanceBefore; +// uint256[] priorTotalShares; +// uint256[] strategyTokenBalance; + +// /** +// * @notice Helper function to test `initiateDelegation` functionality. Handles registering as an operator, depositing tokens +// * into both Weth and Eigen strategies, as well as delegating assets from "stakers" to the operator. +// * @param operatorIndex is the index of the operator to use from the test-data/operators.json file +// * @param amountEigenToDeposit amount of eigen token to deposit +// * @param amountEthToDeposit amount of eth to deposit +// */ + +// function _testInitiateDelegation( +// uint8 operatorIndex, +// uint256 amountEigenToDeposit, +// uint256 amountEthToDeposit +// ) public returns (uint256 amountEthStaked, uint256 amountEigenStaked) { +// address operator = getOperatorAddress(operatorIndex); + +// //setting up operator's delegation terms +// IDelegationManager.OperatorDetails memory operatorDetails = IDelegationManager.OperatorDetails({ +// __deprecated_earningsReceiver: operator, +// delegationApprover: address(0), +// stakerOptOutWindowBlocks: 0 +// }); +// _testRegisterAsOperator(operator, operatorDetails); + +// for (uint256 i; i < stakers.length; i++) { +// //initialize weth, eigen and eth balances for staker +// eigenToken.transfer(stakers[i], amountEigenToDeposit); +// weth.transfer(stakers[i], amountEthToDeposit); + +// //deposit staker's eigen and weth into strategy manager +// _testDepositEigen(stakers[i], amountEigenToDeposit); +// _testDepositWeth(stakers[i], amountEthToDeposit); + +// //delegate the staker's deposits to operator +// uint256 operatorEigenSharesBefore = delegation.operatorShares(operator, eigenStrat); +// uint256 operatorWETHSharesBefore = delegation.operatorShares(operator, wethStrat); +// _testDelegateToOperator(stakers[i], operator); +// //verify that `increaseOperatorShares` worked +// assertTrue( +// delegation.operatorShares(operator, eigenStrat) - operatorEigenSharesBefore == amountEigenToDeposit +// ); +// assertTrue(delegation.operatorShares(operator, wethStrat) - operatorWETHSharesBefore == amountEthToDeposit); +// } +// amountEthStaked += delegation.operatorShares(operator, wethStrat); +// amountEigenStaked += delegation.operatorShares(operator, eigenStrat); + +// return (amountEthStaked, amountEigenStaked); +// } + +// /** +// * @notice Register 'sender' as an operator, setting their 'OperatorDetails' in DelegationManager to 'operatorDetails', verifies +// * that the storage of DelegationManager contract is updated appropriately +// * +// * @param sender is the address being registered as an operator +// * @param operatorDetails is the `sender`'s OperatorDetails struct +// */ +// function _testRegisterAsOperator( +// address sender, +// IDelegationManager.OperatorDetails memory operatorDetails +// ) internal { +// cheats.startPrank(sender); +// string memory emptyStringForMetadataURI; +// delegation.registerAsOperator(operatorDetails, emptyStringForMetadataURI); +// assertTrue(delegation.isOperator(sender), "testRegisterAsOperator: sender is not a operator"); + +// assertTrue( +// keccak256(abi.encode(delegation.operatorDetails(sender))) == keccak256(abi.encode(operatorDetails)), +// "_testRegisterAsOperator: operatorDetails not set appropriately" +// ); + +// assertTrue(delegation.isDelegated(sender), "_testRegisterAsOperator: sender not marked as actively delegated"); +// cheats.stopPrank(); +// } + +// /** +// * @notice Deposits `amountToDeposit` of WETH from address `sender` into `wethStrat`. +// * @param sender The address to spoof calls from using `cheats.startPrank(sender)` +// * @param amountToDeposit Amount of WETH that is first *transferred from this contract to `sender`* and then deposited by `sender` into `stratToDepositTo` +// */ +// function _testDepositWeth(address sender, uint256 amountToDeposit) internal returns (uint256 amountDeposited) { +// cheats.assume(amountToDeposit <= wethInitialSupply); +// amountDeposited = _testDepositToStrategy(sender, amountToDeposit, weth, wethStrat); +// } + +// /** +// * @notice Deposits `amountToDeposit` of EIGEN from address `sender` into `eigenStrat`. +// * @param sender The address to spoof calls from using `cheats.startPrank(sender)` +// * @param amountToDeposit Amount of EIGEN that is first *transferred from this contract to `sender`* and then deposited by `sender` into `stratToDepositTo` +// */ +// function _testDepositEigen(address sender, uint256 amountToDeposit) internal returns (uint256 amountDeposited) { +// cheats.assume(amountToDeposit <= eigenTotalSupply); +// amountDeposited = _testDepositToStrategy(sender, amountToDeposit, eigenToken, eigenStrat); +// } + +// /** +// * @notice Deposits `amountToDeposit` of `underlyingToken` from address `sender` into `stratToDepositTo`. +// * *If* `sender` has zero shares prior to deposit, *then* checks that `stratToDepositTo` is correctly added to their `stakerStrategyList` array. +// * +// * @param sender The address to spoof calls from using `cheats.startPrank(sender)` +// * @param amountToDeposit Amount of WETH that is first *transferred from this contract to `sender`* and then deposited by `sender` into `stratToDepositTo` +// */ +// function _testDepositToStrategy( +// address sender, +// uint256 amountToDeposit, +// IERC20 underlyingToken, +// IStrategy stratToDepositTo +// ) internal returns (uint256 amountDeposited) { +// // deposits will revert when amountToDeposit is 0 +// cheats.assume(amountToDeposit > 0); + +// // whitelist the strategy for deposit, in case it wasn't before +// { +// cheats.startPrank(strategyManager.strategyWhitelister()); +// IStrategy[] memory _strategy = new IStrategy[](1); +// bool[] memory _thirdPartyTransfersForbiddenValues = new bool[](1); +// _strategy[0] = stratToDepositTo; +// strategyManager.addStrategiesToDepositWhitelist(_strategy, _thirdPartyTransfersForbiddenValues); +// cheats.stopPrank(); +// } + +// uint256 operatorSharesBefore = strategyManager.stakerStrategyScaledShares(sender, stratToDepositTo); +// // assumes this contract already has the underlying token! +// uint256 contractBalance = underlyingToken.balanceOf(address(this)); +// // check the expected output +// uint256 expectedSharesOut = stratToDepositTo.underlyingToShares(amountToDeposit); +// // logging and error for misusing this function (see assumption above) +// if (amountToDeposit > contractBalance) { +// emit log("amountToDeposit > contractBalance"); +// emit log_named_uint("amountToDeposit is", amountToDeposit); +// emit log_named_uint("while contractBalance is", contractBalance); +// revert("_testDepositToStrategy failure"); +// } else { +// underlyingToken.transfer(sender, amountToDeposit); +// cheats.startPrank(sender); +// underlyingToken.approve(address(strategyManager), type(uint256).max); +// strategyManager.depositIntoStrategy(stratToDepositTo, underlyingToken, amountToDeposit); +// amountDeposited = amountToDeposit; + +// //check if depositor has never used this strat, that it is added correctly to stakerStrategyList array. +// if (operatorSharesBefore == 0) { +// // check that strategy is appropriately added to dynamic array of all of sender's strategies +// assertTrue( +// strategyManager.stakerStrategyList(sender, strategyManager.stakerStrategyListLength(sender) - 1) == +// stratToDepositTo, +// "_testDepositToStrategy: stakerStrategyList array updated incorrectly" +// ); +// } + +// // check that the shares out match the expected amount out +// assertEq( +// strategyManager.stakerStrategyScaledShares(sender, stratToDepositTo) - operatorSharesBefore, +// expectedSharesOut, +// "_testDepositToStrategy: actual shares out should match expected shares out" +// ); +// } +// cheats.stopPrank(); +// } + +// /** +// * @notice tries to delegate from 'staker' to 'operator', verifies that staker has at least some shares +// * delegatedShares update correctly for 'operator' and delegated status is updated correctly for 'staker' +// * @param staker the staker address to delegate from +// * @param operator the operator address to delegate to +// */ +// function _testDelegateToOperator(address staker, address operator) internal { +// //staker-specific information +// (IStrategy[] memory delegateStrategies, uint256[] memory delegateShares) = strategyManager.getDeposits(staker); + +// uint256 numStrats = delegateShares.length; +// assertTrue(numStrats != 0, "_testDelegateToOperator: delegating from address with no deposits"); +// uint256[] memory inititalSharesInStrats = new uint256[](numStrats); +// for (uint256 i = 0; i < numStrats; ++i) { +// inititalSharesInStrats[i] = delegation.operatorShares(operator, delegateStrategies[i]); +// } + +// cheats.startPrank(staker); +// ISignatureUtils.SignatureWithExpiry memory signatureWithExpiry; +// delegation.delegateTo(operator, signatureWithExpiry, bytes32(0)); +// cheats.stopPrank(); + +// assertTrue( +// delegation.delegatedTo(staker) == operator, +// "_testDelegateToOperator: delegated address not set appropriately" +// ); +// assertTrue(delegation.isDelegated(staker), "_testDelegateToOperator: delegated status not set appropriately"); + +// for (uint256 i = 0; i < numStrats; ++i) { +// uint256 operatorSharesBefore = inititalSharesInStrats[i]; +// uint256 operatorSharesAfter = delegation.operatorShares(operator, delegateStrategies[i]); +// assertTrue( +// operatorSharesAfter == (operatorSharesBefore + delegateShares[i]), +// "_testDelegateToOperator: delegatedShares not increased correctly" +// ); +// } +// } + +// /** +// * @notice deploys 'numStratsToAdd' strategies contracts and initializes them to treat `underlyingToken` as their underlying token +// * and then deposits 'amountToDeposit' to each of them from 'sender' +// * +// * @param sender address that is depositing into the strategies +// * @param amountToDeposit amount being deposited +// * @param numStratsToAdd number of strategies that are being deployed and deposited into +// */ +// function _testDepositStrategies(address sender, uint256 amountToDeposit, uint8 numStratsToAdd) internal { +// // hard-coded input +// IERC20 underlyingToken = weth; + +// cheats.assume(numStratsToAdd > 0 && numStratsToAdd <= 20); +// IStrategy[] memory stratsToDepositTo = new IStrategy[](numStratsToAdd); +// for (uint8 i = 0; i < numStratsToAdd; ++i) { +// stratsToDepositTo[i] = StrategyBase( +// address( +// new TransparentUpgradeableProxy( +// address(baseStrategyImplementation), +// address(eigenLayerProxyAdmin), +// abi.encodeWithSelector(StrategyBase.initialize.selector, underlyingToken, eigenLayerPauserReg) +// ) +// ) +// ); +// _testDepositToStrategy(sender, amountToDeposit, weth, StrategyBase(address(stratsToDepositTo[i]))); +// } +// for (uint8 i = 0; i < numStratsToAdd; ++i) { +// // check that strategy is appropriately added to dynamic array of all of sender's strategies +// assertTrue( +// strategyManager.stakerStrategyList(sender, i) == stratsToDepositTo[i], +// "stakerStrategyList array updated incorrectly" +// ); + +// // TODO: perhaps remove this is we can. seems brittle if we don't track the number of strategies somewhere +// //store strategy in mapping of strategies +// strategies[i] = IStrategy(address(stratsToDepositTo[i])); +// } +// } + +// /** +// * @notice Creates a queued withdrawal from `staker`. Begins by registering the staker as a delegate (if specified), then deposits `amountToDeposit` +// * into the WETH strategy, and then queues a withdrawal using +// * `strategyManager.queueWithdrawal(strategyIndexes, strategyArray, tokensArray, shareAmounts, withdrawer)` +// * @notice After initiating a queued withdrawal, this test checks that `strategyManager.canCompleteQueuedWithdrawal` immediately returns the correct +// * response depending on whether `staker` is delegated or not. +// * @param staker The address to initiate the queued withdrawal +// * @param registerAsOperator If true, `staker` will also register as a delegate in the course of this function +// * @param amountToDeposit The amount of WETH to deposit +// */ +// function _createQueuedWithdrawal( +// address staker, +// bool registerAsOperator, +// uint256 amountToDeposit, +// IStrategy[] memory strategyArray, +// uint256[] memory shareAmounts, +// uint256[] memory strategyIndexes, +// address withdrawer +// ) internal returns (bytes32 withdrawalRoot, IDelegationManager.Withdrawal memory queuedWithdrawal) { +// require(amountToDeposit >= shareAmounts[0], "_createQueuedWithdrawal: sanity check failed"); + +// // we do this here to ensure that `staker` is delegated if `registerAsOperator` is true +// if (registerAsOperator) { +// assertTrue(!delegation.isDelegated(staker), "_createQueuedWithdrawal: staker is already delegated"); +// IDelegationManager.OperatorDetails memory operatorDetails = IDelegationManager.OperatorDetails({ +// __deprecated_earningsReceiver: staker, +// delegationApprover: address(0), +// stakerOptOutWindowBlocks: 0 +// }); +// _testRegisterAsOperator(staker, operatorDetails); +// assertTrue( +// delegation.isDelegated(staker), +// "_createQueuedWithdrawal: staker isn't delegated when they should be" +// ); +// } + +// queuedWithdrawal = IDelegationManager.Withdrawal({ +// strategies: strategyArray, +// scaledShares: shareAmounts, +// staker: staker, +// withdrawer: withdrawer, +// nonce: delegation.cumulativeWithdrawalsQueued(staker), +// delegatedTo: delegation.delegatedTo(staker), +// startBlock: uint32(block.number) +// }); + +// { +// //make deposit in WETH strategy +// uint256 amountDeposited = _testDepositWeth(staker, amountToDeposit); +// // We can't withdraw more than we deposit +// if (shareAmounts[0] > amountDeposited) { +// cheats.expectRevert("StrategyManager._removeShares: shareAmount too high"); +// } +// } + +// //queue the withdrawal +// withdrawalRoot = _testQueueWithdrawal(staker, strategyIndexes, strategyArray, shareAmounts, withdrawer); +// return (withdrawalRoot, queuedWithdrawal); +// } + +// /** +// * Helper for ECDSA signatures: combines V and S into VS - if S is greater than SECP256K1N_MODULUS_HALF, then we +// * get the modulus, so that the leading bit of s is always 0. Then we set the leading +// * bit to be either 0 or 1 based on the value of v, which is either 27 or 28 +// */ +// function getVSfromVandS(uint8 v, bytes32 s) internal view returns (bytes32) { +// if (uint256(s) > SECP256K1N_MODULUS_HALF) { +// s = bytes32(SECP256K1N_MODULUS - uint256(s)); +// } + +// bytes32 vs = s; +// if (v == 28) { +// vs = bytes32(uint256(s) ^ (1 << 255)); +// } + +// return vs; +// } + +// /// @notice registers a fixed address as an operator, delegates to it from a second address, +// /// and checks that the operator's voteWeights increase properly +// /// @param operator is the operator being delegated to. +// /// @param staker is the staker delegating stake to the operator. +// /// @param ethAmount is the amount of ETH to deposit into the operator's strategy. +// /// @param eigenAmount is the amount of EIGEN to deposit into the operator's strategy. +// function _testDelegation( +// address operator, +// address staker, +// uint256 ethAmount, +// uint256 eigenAmount +// ) internal { +// if (!delegation.isOperator(operator)) { +// IDelegationManager.OperatorDetails memory operatorDetails = IDelegationManager.OperatorDetails({ +// __deprecated_earningsReceiver: operator, +// delegationApprover: address(0), +// stakerOptOutWindowBlocks: 0 +// }); +// _testRegisterAsOperator(operator, operatorDetails); +// } + +// uint256 amountBefore = delegation.operatorShares(operator, wethStrat); + +// //making additional deposits to the strategies +// assertTrue(!delegation.isDelegated(staker) == true, "testDelegation: staker is not delegate"); +// _testDepositWeth(staker, ethAmount); +// _testDepositEigen(staker, eigenAmount); +// _testDelegateToOperator(staker, operator); +// assertTrue(delegation.isDelegated(staker) == true, "testDelegation: staker is not delegate"); + +// (/*IStrategy[] memory updatedStrategies*/, uint256[] memory updatedShares) = strategyManager.getDeposits(staker); + +// IStrategy _strat = wethStrat; +// // IStrategy _strat = strategyManager.stakerStrategyList(staker, 0); +// assertTrue(address(_strat) != address(0), "stakerStrategyList not updated correctly"); + +// assertTrue( +// delegation.operatorShares(operator, _strat) - updatedShares[0] == amountBefore, +// "ETH operatorShares not updated correctly" +// ); +// } + +// /** +// * @notice Helper function to complete an existing queued withdrawal in shares +// * @param depositor is the address of the staker who queued a withdrawal +// * @param strategyArray is the array of strategies to withdraw from +// * @param tokensArray is the array of tokens to withdraw from said strategies +// * @param shareAmounts is the array of shares to be withdrawn from said strategies +// * @param delegatedTo is the address the staker has delegated their shares to +// * @param withdrawalStartBlock the block number of the original queued withdrawal +// * @param middlewareTimesIndex index in the middlewareTimes array used to queue this withdrawal +// */ + +// function _testCompleteQueuedWithdrawalShares( +// address depositor, +// IStrategy[] memory strategyArray, +// IERC20[] memory tokensArray, +// uint256[] memory shareAmounts, +// address delegatedTo, +// address withdrawer, +// uint256 nonce, +// uint32 withdrawalStartBlock, +// uint256 middlewareTimesIndex +// ) internal { +// cheats.startPrank(withdrawer); + +// for (uint256 i = 0; i < strategyArray.length; i++) { +// sharesBefore.push(strategyManager.stakerStrategyScaledShares(withdrawer, strategyArray[i])); +// } +// // emit log_named_uint("strategies", strategyArray.length); +// // emit log_named_uint("tokens", tokensArray.length); +// // emit log_named_uint("shares", shareAmounts.length); +// // emit log_named_address("depositor", depositor); +// // emit log_named_uint("withdrawalStartBlock", withdrawalStartBlock); +// // emit log_named_address("delegatedAddress", delegatedTo); +// // emit log("************************************************************************************************"); + +// IDelegationManager.Withdrawal memory queuedWithdrawal = IDelegationManager.Withdrawal({ +// strategies: strategyArray, +// scaledShares: shareAmounts, +// staker: depositor, +// withdrawer: withdrawer, +// nonce: nonce, +// startBlock: withdrawalStartBlock, +// delegatedTo: delegatedTo +// }); + +// // complete the queued withdrawal +// delegation.completeQueuedWithdrawal(queuedWithdrawal, tokensArray, middlewareTimesIndex, false); + +// for (uint256 i = 0; i < strategyArray.length; i++) { +// require( +// strategyManager.stakerStrategyScaledShares(withdrawer, strategyArray[i]) == sharesBefore[i] + shareAmounts[i], +// "_testCompleteQueuedWithdrawalShares: withdrawer shares not incremented" +// ); +// } +// cheats.stopPrank(); +// } + +// /** +// * @notice Helper function to complete an existing queued withdrawal in tokens +// * @param depositor is the address of the staker who queued a withdrawal +// * @param strategyArray is the array of strategies to withdraw from +// * @param tokensArray is the array of tokens to withdraw from said strategies +// * @param shareAmounts is the array of shares to be withdrawn from said strategies +// * @param delegatedTo is the address the staker has delegated their shares to +// * @param withdrawalStartBlock the block number of the original queued withdrawal +// * @param middlewareTimesIndex index in the middlewareTimes array used to queue this withdrawal +// */ +// function _testCompleteQueuedWithdrawalTokens( +// address depositor, +// IStrategy[] memory strategyArray, +// IERC20[] memory tokensArray, +// uint256[] memory shareAmounts, +// address delegatedTo, +// address withdrawer, +// uint256 nonce, +// uint32 withdrawalStartBlock, +// uint256 middlewareTimesIndex +// ) internal { +// cheats.startPrank(withdrawer); + +// for (uint256 i = 0; i < strategyArray.length; i++) { +// balanceBefore.push(strategyArray[i].underlyingToken().balanceOf(withdrawer)); +// priorTotalShares.push(strategyArray[i].totalShares()); +// strategyTokenBalance.push(strategyArray[i].underlyingToken().balanceOf(address(strategyArray[i]))); +// } + +// IDelegationManager.Withdrawal memory queuedWithdrawal = IDelegationManager.Withdrawal({ +// strategies: strategyArray, +// scaledShares: shareAmounts, +// staker: depositor, +// withdrawer: withdrawer, +// nonce: nonce, +// startBlock: withdrawalStartBlock, +// delegatedTo: delegatedTo +// }); +// // complete the queued withdrawal +// delegation.completeQueuedWithdrawal(queuedWithdrawal, tokensArray, middlewareTimesIndex, true); + +// for (uint256 i = 0; i < strategyArray.length; i++) { +// //uint256 strategyTokenBalance = strategyArray[i].underlyingToken().balanceOf(address(strategyArray[i])); +// uint256 tokenBalanceDelta = (strategyTokenBalance[i] * shareAmounts[i]) / priorTotalShares[i]; + +// // filter out unrealistic case, where the withdrawer is the strategy contract itself +// cheats.assume(withdrawer != address(strategyArray[i])); +// require( +// strategyArray[i].underlyingToken().balanceOf(withdrawer) == balanceBefore[i] + tokenBalanceDelta, +// "_testCompleteQueuedWithdrawalTokens: withdrawer balance not incremented" +// ); +// } +// cheats.stopPrank(); +// } + +// function _testQueueWithdrawal( +// address depositor, +// uint256[] memory /*strategyIndexes*/, +// IStrategy[] memory strategyArray, +// uint256[] memory shareAmounts, +// address withdrawer +// ) internal returns (bytes32) { +// cheats.startPrank(depositor); + +// IDelegationManager.QueuedWithdrawalParams[] memory params = new IDelegationManager.QueuedWithdrawalParams[](1); + +// params[0] = IDelegationManager.QueuedWithdrawalParams({ +// strategies: strategyArray, +// scaledShares: shareAmounts, +// withdrawer: withdrawer +// }); + +// bytes32[] memory withdrawalRoots = new bytes32[](1); +// withdrawalRoots = delegation.queueWithdrawals(params); +// cheats.stopPrank(); +// return withdrawalRoots[0]; +// } +// } \ No newline at end of file diff --git a/src/test/Pausable.t.sol b/src/test/Pausable.t.sol index 9b6b878ec..2b6e5b1dd 100644 --- a/src/test/Pausable.t.sol +++ b/src/test/Pausable.t.sol @@ -1,90 +1,90 @@ // SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.12; - -import "./EigenLayerTestHelper.t.sol"; - -contract PausableTests is EigenLayerTestHelper { - - /// @notice Emitted when the `pauserRegistry` is set to `newPauserRegistry`. - event PauserRegistrySet(IPauserRegistry pauserRegistry, IPauserRegistry newPauserRegistry); - - ///@dev test that pausing a contract works - function testPausingWithdrawalsFromStrategyManager(uint256 amountToDeposit, uint256 amountToWithdraw) public { - cheats.assume(amountToDeposit <= 1e38 - 1); - cheats.assume(amountToDeposit <= weth.balanceOf(address(this))); - // if first deposit amount to base strategy is too small, it will revert. ignore that case here. - cheats.assume(amountToDeposit >= 1); - cheats.assume(amountToWithdraw <= amountToDeposit); - - address sender = getOperatorAddress(0); - _testDepositToStrategy(sender, amountToDeposit, weth, wethStrat); - - cheats.startPrank(pauser); - strategyManager.pause(type(uint256).max); - cheats.stopPrank(); - - // uint256 strategyIndex = 0; - - cheats.prank(sender); - - // TODO: write this to work with completing a queued withdrawal - // cheats.expectRevert(bytes("Pausable: paused")); - // strategyManager.withdrawFromStrategy(strategyIndex, wethStrat, weth, amountToWithdraw); - // cheats.stopPrank(); - } - - function testUnauthorizedPauserStrategyManager(address unauthorizedPauser) - public - fuzzedAddress(unauthorizedPauser) - { - cheats.assume(!eigenLayerPauserReg.isPauser(unauthorizedPauser)); - cheats.startPrank(unauthorizedPauser); - cheats.expectRevert(bytes("msg.sender is not permissioned as pauser")); - strategyManager.pause(type(uint256).max); - cheats.stopPrank(); - } - - function testSetPauser(address newPauser) public fuzzedAddress(newPauser) { - cheats.startPrank(unpauser); - eigenLayerPauserReg.setIsPauser(newPauser, true); - cheats.stopPrank(); - } - - function testSetUnpauser(address newUnpauser) public fuzzedAddress(newUnpauser) { - cheats.startPrank(unpauser); - eigenLayerPauserReg.setUnpauser(newUnpauser); - cheats.stopPrank(); - } - - function testSetPauserUnauthorized(address fakePauser, address newPauser) - public - fuzzedAddress(newPauser) - fuzzedAddress(fakePauser) - { - cheats.assume(fakePauser != eigenLayerPauserReg.unpauser()); - cheats.startPrank(fakePauser); - cheats.expectRevert(bytes("msg.sender is not permissioned as unpauser")); - eigenLayerPauserReg.setIsPauser(newPauser, true); - cheats.stopPrank(); - } - - function testSetPauserRegistryUnpauser(IPauserRegistry newPauserRegistry) public { - cheats.assume(address(newPauserRegistry) != address(0)); - IPauserRegistry oldPauserRegistry = strategyManager.pauserRegistry(); - cheats.prank(unpauser); - cheats.expectEmit(true, true, true, true, address(strategyManager)); - emit PauserRegistrySet(oldPauserRegistry, newPauserRegistry); - strategyManager.setPauserRegistry(newPauserRegistry); +pragma solidity ^0.8.27; + +// import "./EigenLayerTestHelper.t.sol"; + +// contract PausableTests is EigenLayerTestHelper { + +// /// @notice Emitted when the `pauserRegistry` is set to `newPauserRegistry`. +// event PauserRegistrySet(IPauserRegistry pauserRegistry, IPauserRegistry newPauserRegistry); + +// ///@dev test that pausing a contract works +// function testPausingWithdrawalsFromStrategyManager(uint256 amountToDeposit, uint256 amountToWithdraw) public { +// cheats.assume(amountToDeposit <= 1e38 - 1); +// cheats.assume(amountToDeposit <= weth.balanceOf(address(this))); +// // if first deposit amount to base strategy is too small, it will revert. ignore that case here. +// cheats.assume(amountToDeposit >= 1); +// cheats.assume(amountToWithdraw <= amountToDeposit); + +// address sender = getOperatorAddress(0); +// _testDepositToStrategy(sender, amountToDeposit, weth, wethStrat); + +// cheats.startPrank(pauser); +// strategyManager.pause(type(uint256).max); +// cheats.stopPrank(); + +// // uint256 strategyIndex = 0; + +// cheats.prank(sender); + +// // TODO: write this to work with completing a queued withdrawal +// // cheats.expectRevert(bytes("Pausable: paused")); +// // strategyManager.withdrawFromStrategy(strategyIndex, wethStrat, weth, amountToWithdraw); +// // cheats.stopPrank(); +// } + +// function testUnauthorizedPauserStrategyManager(address unauthorizedPauser) +// public +// fuzzedAddress(unauthorizedPauser) +// { +// cheats.assume(!eigenLayerPauserReg.isPauser(unauthorizedPauser)); +// cheats.startPrank(unauthorizedPauser); +// cheats.expectRevert(bytes("msg.sender is not permissioned as pauser")); +// strategyManager.pause(type(uint256).max); +// cheats.stopPrank(); +// } + +// function testSetPauser(address newPauser) public fuzzedAddress(newPauser) { +// cheats.startPrank(unpauser); +// eigenLayerPauserReg.setIsPauser(newPauser, true); +// cheats.stopPrank(); +// } + +// function testSetUnpauser(address newUnpauser) public fuzzedAddress(newUnpauser) { +// cheats.startPrank(unpauser); +// eigenLayerPauserReg.setUnpauser(newUnpauser); +// cheats.stopPrank(); +// } + +// function testSetPauserUnauthorized(address fakePauser, address newPauser) +// public +// fuzzedAddress(newPauser) +// fuzzedAddress(fakePauser) +// { +// cheats.assume(fakePauser != eigenLayerPauserReg.unpauser()); +// cheats.startPrank(fakePauser); +// cheats.expectRevert(bytes("msg.sender is not permissioned as unpauser")); +// eigenLayerPauserReg.setIsPauser(newPauser, true); +// cheats.stopPrank(); +// } + +// function testSetPauserRegistryUnpauser(IPauserRegistry newPauserRegistry) public { +// cheats.assume(address(newPauserRegistry) != address(0)); +// IPauserRegistry oldPauserRegistry = strategyManager.pauserRegistry(); +// cheats.prank(unpauser); +// cheats.expectEmit(true, true, true, true, address(strategyManager)); +// emit PauserRegistrySet(oldPauserRegistry, newPauserRegistry); +// strategyManager.setPauserRegistry(newPauserRegistry); - assertEq(address(newPauserRegistry), address(strategyManager.pauserRegistry())); - } +// assertEq(address(newPauserRegistry), address(strategyManager.pauserRegistry())); +// } - function testSetPauserRegistyUnauthorized(IPauserRegistry newPauserRegistry, address notUnpauser) public fuzzedAddress(notUnpauser) { - cheats.assume(notUnpauser != eigenLayerPauserReg.unpauser()); +// function testSetPauserRegistyUnauthorized(IPauserRegistry newPauserRegistry, address notUnpauser) public fuzzedAddress(notUnpauser) { +// cheats.assume(notUnpauser != eigenLayerPauserReg.unpauser()); - cheats.prank(notUnpauser); - cheats.expectRevert(bytes("msg.sender is not permissioned as unpauser")); - strategyManager.setPauserRegistry(newPauserRegistry); - } -} +// cheats.prank(notUnpauser); +// cheats.expectRevert(bytes("msg.sender is not permissioned as unpauser")); +// strategyManager.setPauserRegistry(newPauserRegistry); +// } +// } \ No newline at end of file diff --git a/src/test/Strategy.t.sol b/src/test/Strategy.t.sol index 3139e92a2..4ad9ed2fd 100644 --- a/src/test/Strategy.t.sol +++ b/src/test/Strategy.t.sol @@ -1,58 +1,58 @@ // SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.12; - -import "./EigenLayerTestHelper.t.sol"; -import "../contracts/core/StrategyManagerStorage.sol"; - -contract StrategyTests is EigenLayerTestHelper { - /// @notice This function tests to ensure that a delegation contract - /// cannot be intitialized multiple times - function testCannotInitMultipleTimesDelegation() public cannotReinit { - wethStrat.initialize(weth, eigenLayerPauserReg); - } - - ///@notice This function tests to ensure that only the strategyManager - /// can deposit into a strategy - ///@param invalidDepositor is the non-registered depositor - function testInvalidCalltoDeposit(address invalidDepositor) public fuzzedAddress(invalidDepositor) { - IERC20 underlyingToken = wethStrat.underlyingToken(); - - cheats.startPrank(invalidDepositor); - cheats.expectRevert(bytes("StrategyBase.onlyStrategyManager")); - wethStrat.deposit(underlyingToken, 1e18); - cheats.stopPrank(); - } - - ///@notice This function tests to ensure that only the strategyManager - /// can deposit into a strategy - ///@param invalidWithdrawer is the non-registered withdrawer - ///@param depositor is the depositor for which the shares are being withdrawn - function testInvalidCalltoWithdraw(address depositor, address invalidWithdrawer) - public - fuzzedAddress(invalidWithdrawer) - { - IERC20 underlyingToken = wethStrat.underlyingToken(); - - cheats.startPrank(invalidWithdrawer); - cheats.expectRevert(bytes("StrategyBase.onlyStrategyManager")); - wethStrat.withdraw(depositor, underlyingToken, 1e18); - cheats.stopPrank(); - } - - ///@notice This function tests ensures that withdrawing for a depositor that never - /// actually deposited fails. - ///@param depositor is the depositor for which the shares are being withdrawn - function testWithdrawalExceedsTotalShares(address depositor, uint256 shares) public fuzzedAddress(depositor) { - cheats.assume(shares > strategyManager.stakerStrategyShares(depositor, wethStrat)); - IERC20 underlyingToken = wethStrat.underlyingToken(); - - cheats.startPrank(address(strategyManager)); - - cheats.expectRevert( - bytes("StrategyBase.withdraw: amountShares must be less than or equal to totalShares") - ); - wethStrat.withdraw(depositor, underlyingToken, shares); - - cheats.stopPrank(); - } -} +pragma solidity ^0.8.27; + +// import "./EigenLayerTestHelper.t.sol"; +// import "../contracts/core/StrategyManagerStorage.sol"; + +// contract StrategyTests is EigenLayerTestHelper { +// /// @notice This function tests to ensure that a delegation contract +// /// cannot be intitialized multiple times +// function testCannotInitMultipleTimesDelegation() public cannotReinit { +// wethStrat.initialize(weth, eigenLayerPauserReg); +// } + +// ///@notice This function tests to ensure that only the strategyManager +// /// can deposit into a strategy +// ///@param invalidDepositor is the non-registered depositor +// function testInvalidCalltoDeposit(address invalidDepositor) public fuzzedAddress(invalidDepositor) { +// IERC20 underlyingToken = wethStrat.underlyingToken(); + +// cheats.startPrank(invalidDepositor); +// cheats.expectRevert(bytes("StrategyBase.onlyStrategyManager")); +// wethStrat.deposit(underlyingToken, 1e18); +// cheats.stopPrank(); +// } + +// ///@notice This function tests to ensure that only the strategyManager +// /// can deposit into a strategy +// ///@param invalidWithdrawer is the non-registered withdrawer +// ///@param depositor is the depositor for which the shares are being withdrawn +// function testInvalidCalltoWithdraw(address depositor, address invalidWithdrawer) +// public +// fuzzedAddress(invalidWithdrawer) +// { +// IERC20 underlyingToken = wethStrat.underlyingToken(); + +// cheats.startPrank(invalidWithdrawer); +// cheats.expectRevert(bytes("StrategyBase.onlyStrategyManager")); +// wethStrat.withdraw(depositor, underlyingToken, 1e18); +// cheats.stopPrank(); +// } + +// ///@notice This function tests ensures that withdrawing for a depositor that never +// /// actually deposited fails. +// ///@param depositor is the depositor for which the shares are being withdrawn +// function testWithdrawalExceedsTotalShares(address depositor, uint256 shares) public fuzzedAddress(depositor) { +// cheats.assume(shares > strategyManager.stakerStrategyShares(depositor, wethStrat)); +// IERC20 underlyingToken = wethStrat.underlyingToken(); + +// cheats.startPrank(address(strategyManager)); + +// cheats.expectRevert( +// bytes("StrategyBase.withdraw: amountShares must be less than or equal to totalShares") +// ); +// wethStrat.withdraw(depositor, underlyingToken, shares); + +// cheats.stopPrank(); +// } +// } \ No newline at end of file diff --git a/src/test/Withdrawals.t.sol b/src/test/Withdrawals.t.sol index f8f780e7a..f806080f1 100644 --- a/src/test/Withdrawals.t.sol +++ b/src/test/Withdrawals.t.sol @@ -1,285 +1,284 @@ // SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.12; - -import "../test/EigenLayerTestHelper.t.sol"; - -contract WithdrawalTests is EigenLayerTestHelper { - // packed info used to help handle stack-too-deep errors - struct DataForTestWithdrawal { - IStrategy[] delegatorStrategies; - uint256[] delegatorShares; - address withdrawer; - uint96 nonce; - } - - bytes32 defaultOperatorId = bytes32(uint256(0)); - - function setUp() public virtual override { - EigenLayerDeployer.setUp(); - } - - //This function helps with stack too deep issues with "testWithdrawal" test - function testWithdrawalWrapper( - address operator, - address depositor, - uint96 ethAmount, - uint96 eigenAmount, - bool withdrawAsTokens, - bool RANDAO - ) public fuzzedAddress(operator) fuzzedAddress(depositor) { - cheats.assume(depositor != operator); - cheats.assume(ethAmount >= 1 && ethAmount <= 1e18); - cheats.assume(eigenAmount >= 1 && eigenAmount <= 1e18); - - address withdrawer = depositor; - - if (RANDAO) { - _testWithdrawalAndDeregistration(operator, depositor, withdrawer, ethAmount, eigenAmount, withdrawAsTokens); - } else { - _testWithdrawalWithStakeUpdate(operator, depositor, withdrawer, ethAmount, eigenAmount, withdrawAsTokens); - } - } - - /// @notice test staker's ability to undelegate/withdraw from an operator. - /// @param operator is the operator being delegated to. - /// @param depositor is the staker delegating stake to the operator. - function _testWithdrawalAndDeregistration( - address operator, - address depositor, - address withdrawer, - uint96 ethAmount, - uint96 eigenAmount, - bool withdrawAsTokens - ) internal { - _initiateDelegation(operator, depositor, ethAmount, eigenAmount); - - address delegatedTo = delegation.delegatedTo(depositor); - - // packed data structure to deal with stack-too-deep issues - DataForTestWithdrawal memory dataForTestWithdrawal; - - // scoped block to deal with stack-too-deep issues - { - //delegator-specific information - (IStrategy[] memory delegatorStrategies, uint256[] memory delegatorShares) = strategyManager.getDeposits( - depositor - ); - dataForTestWithdrawal.delegatorStrategies = delegatorStrategies; - dataForTestWithdrawal.delegatorShares = delegatorShares; - dataForTestWithdrawal.withdrawer = withdrawer; - // harcoded nonce value - dataForTestWithdrawal.nonce = 0; - } - - uint256[] memory strategyIndexes = new uint256[](2); - IERC20[] memory tokensArray = new IERC20[](2); - { - // hardcoded values - strategyIndexes[0] = 0; - strategyIndexes[1] = 0; - tokensArray[0] = weth; - tokensArray[1] = eigenToken; - } - - cheats.warp(uint32(block.timestamp) + 1 days); - cheats.roll(uint32(block.timestamp) + 1 days); - - _testQueueWithdrawal( - depositor, - strategyIndexes, - dataForTestWithdrawal.delegatorStrategies, - dataForTestWithdrawal.delegatorShares, - withdrawer - ); - uint32 queuedWithdrawalBlock = uint32(block.number); - - //now withdrawal block time is before deregistration - cheats.warp(uint32(block.timestamp) + 2 days); - cheats.roll(uint32(block.timestamp) + 2 days); - - { - //warp past the serve until time, which is 3 days from the beginning. THis puts us at 4 days past that point - cheats.warp(uint32(block.timestamp) + 4 days); - cheats.roll(uint32(block.timestamp) + 4 days); - - uint256 middlewareTimeIndex = 1; - if (withdrawAsTokens) { - _testCompleteQueuedWithdrawalTokens( - depositor, - dataForTestWithdrawal.delegatorStrategies, - tokensArray, - dataForTestWithdrawal.delegatorShares, - delegatedTo, - dataForTestWithdrawal.withdrawer, - dataForTestWithdrawal.nonce, - queuedWithdrawalBlock, - middlewareTimeIndex - ); - } else { - _testCompleteQueuedWithdrawalShares( - depositor, - dataForTestWithdrawal.delegatorStrategies, - tokensArray, - dataForTestWithdrawal.delegatorShares, - delegatedTo, - dataForTestWithdrawal.withdrawer, - dataForTestWithdrawal.nonce, - queuedWithdrawalBlock, - middlewareTimeIndex - ); - } - } - } - - /// @notice test staker's ability to undelegate/withdraw from an operator. - /// @param operator is the operator being delegated to. - /// @param depositor is the staker delegating stake to the operator. - function _testWithdrawalWithStakeUpdate( - address operator, - address depositor, - address withdrawer, - uint96 ethAmount, - uint96 eigenAmount, - bool withdrawAsTokens - ) public { - _initiateDelegation(operator, depositor, ethAmount, eigenAmount); - - // emit log_named_uint("Linked list element 1", uint256(uint160(address(generalServiceManager1)))); - // emit log_named_uint("Linked list element 2", uint256(uint160(address(generalServiceManager2)))); - // emit log("________________________________________________________________"); - // emit log_named_uint("Middleware 1 Update Block", uint32(block.number)); - - cheats.warp(uint32(block.timestamp) + 1 days); - cheats.roll(uint32(block.number) + 1); - - // emit log_named_uint("Middleware 2 Update Block", uint32(block.number)); - - address delegatedTo = delegation.delegatedTo(depositor); - - // packed data structure to deal with stack-too-deep issues - DataForTestWithdrawal memory dataForTestWithdrawal; - - // scoped block to deal with stack-too-deep issues - { - //delegator-specific information - (IStrategy[] memory delegatorStrategies, uint256[] memory delegatorShares) = strategyManager.getDeposits( - depositor - ); - dataForTestWithdrawal.delegatorStrategies = delegatorStrategies; - dataForTestWithdrawal.delegatorShares = delegatorShares; - dataForTestWithdrawal.withdrawer = withdrawer; - // harcoded nonce value - dataForTestWithdrawal.nonce = 0; - } - - uint256[] memory strategyIndexes = new uint256[](2); - IERC20[] memory tokensArray = new IERC20[](2); - { - // hardcoded values - strategyIndexes[0] = 0; - strategyIndexes[1] = 0; - tokensArray[0] = weth; - tokensArray[1] = eigenToken; - } - - cheats.warp(uint32(block.timestamp) + 1 days); - cheats.roll(uint32(block.number) + 1); - - _testQueueWithdrawal( - depositor, - strategyIndexes, - dataForTestWithdrawal.delegatorStrategies, - dataForTestWithdrawal.delegatorShares, - dataForTestWithdrawal.withdrawer - ); - uint32 queuedWithdrawalBlock = uint32(block.number); - - //now withdrawal block time is before deregistration - cheats.warp(uint32(block.timestamp) + 2 days); - cheats.roll(uint32(block.number) + 2); - - // uint256 prevElement = uint256(uint160(address(generalServiceManager2))); - - cheats.warp(uint32(block.timestamp) + 1 days); - cheats.roll(uint32(block.number) + 1); - - // prevElement = uint256(uint160(address(generalServiceManager1))); - - { - //warp past the serve until time, which is 3 days from the beginning. THis puts us at 4 days past that point - cheats.warp(uint32(block.timestamp) + 4 days); - cheats.roll(uint32(block.number) + 4); - - uint256 middlewareTimeIndex = 3; - if (withdrawAsTokens) { - _testCompleteQueuedWithdrawalTokens( - depositor, - dataForTestWithdrawal.delegatorStrategies, - tokensArray, - dataForTestWithdrawal.delegatorShares, - delegatedTo, - dataForTestWithdrawal.withdrawer, - dataForTestWithdrawal.nonce, - queuedWithdrawalBlock, - middlewareTimeIndex - ); - } else { - _testCompleteQueuedWithdrawalShares( - depositor, - dataForTestWithdrawal.delegatorStrategies, - tokensArray, - dataForTestWithdrawal.delegatorShares, - delegatedTo, - dataForTestWithdrawal.withdrawer, - dataForTestWithdrawal.nonce, - queuedWithdrawalBlock, - middlewareTimeIndex - ); - } - } - } - - // @notice This function tests to ensure that a delegator can re-delegate to an operator after undelegating. - // @param operator is the operator being delegated to. - // @param staker is the staker delegating stake to the operator. - function testRedelegateAfterWithdrawal( - address operator, - address depositor, - uint96 ethAmount, - uint96 eigenAmount, - bool withdrawAsShares - ) public fuzzedAddress(operator) fuzzedAddress(depositor) { - cheats.assume(depositor != operator); - //this function performs delegation and subsequent withdrawal - testWithdrawalWrapper(operator, depositor, ethAmount, eigenAmount, withdrawAsShares, true); - - cheats.prank(depositor); - delegation.undelegate(depositor); - - //warps past fraudproof time interval - cheats.warp(block.timestamp + 7 days + 1); - _initiateDelegation(operator, depositor, ethAmount, eigenAmount); - } - - // Helper function to begin a delegation - function _initiateDelegation( - address operator, - address staker, - uint96 ethAmount, - uint96 eigenAmount - ) internal fuzzedAddress(operator) fuzzedAddress(staker) fuzzedAmounts(ethAmount, eigenAmount) { - cheats.assume(staker != operator); - // base strategy will revert if these amounts are too small on first deposit - cheats.assume(ethAmount >= 1); - cheats.assume(eigenAmount >= 2); - - _testDelegation(operator, staker, ethAmount, eigenAmount); - } - - modifier fuzzedAmounts(uint256 ethAmount, uint256 eigenAmount) { - cheats.assume(ethAmount >= 0 && ethAmount <= 1e18); - cheats.assume(eigenAmount >= 0 && eigenAmount <= 1e18); - _; - } -} - +pragma solidity ^0.8.27; + +// import "../test/EigenLayerTestHelper.t.sol"; + +// contract WithdrawalTests is EigenLayerTestHelper { +// // packed info used to help handle stack-too-deep errors +// struct DataForTestWithdrawal { +// IStrategy[] delegatorStrategies; +// uint256[] delegatorShares; +// address withdrawer; +// uint96 nonce; +// } + +// bytes32 defaultOperatorId = bytes32(uint256(0)); + +// function setUp() public virtual override { +// EigenLayerDeployer.setUp(); +// } + +// //This function helps with stack too deep issues with "testWithdrawal" test +// function testWithdrawalWrapper( +// address operator, +// address depositor, +// uint96 ethAmount, +// uint96 eigenAmount, +// bool withdrawAsTokens, +// bool RANDAO +// ) public fuzzedAddress(operator) fuzzedAddress(depositor) { +// cheats.assume(depositor != operator); +// cheats.assume(ethAmount >= 1 && ethAmount <= 1e18); +// cheats.assume(eigenAmount >= 1 && eigenAmount <= 1e18); + +// address withdrawer = depositor; + +// if (RANDAO) { +// _testWithdrawalAndDeregistration(operator, depositor, withdrawer, ethAmount, eigenAmount, withdrawAsTokens); +// } else { +// _testWithdrawalWithStakeUpdate(operator, depositor, withdrawer, ethAmount, eigenAmount, withdrawAsTokens); +// } +// } + +// /// @notice test staker's ability to undelegate/withdraw from an operator. +// /// @param operator is the operator being delegated to. +// /// @param depositor is the staker delegating stake to the operator. +// function _testWithdrawalAndDeregistration( +// address operator, +// address depositor, +// address withdrawer, +// uint96 ethAmount, +// uint96 eigenAmount, +// bool withdrawAsTokens +// ) internal { +// _initiateDelegation(operator, depositor, ethAmount, eigenAmount); + +// address delegatedTo = delegation.delegatedTo(depositor); + +// // packed data structure to deal with stack-too-deep issues +// DataForTestWithdrawal memory dataForTestWithdrawal; + +// // scoped block to deal with stack-too-deep issues +// { +// //delegator-specific information +// (IStrategy[] memory delegatorStrategies, uint256[] memory delegatorShares) = strategyManager.getDeposits( +// depositor +// ); +// dataForTestWithdrawal.delegatorStrategies = delegatorStrategies; +// dataForTestWithdrawal.delegatorShares = delegatorShares; +// dataForTestWithdrawal.withdrawer = withdrawer; +// // harcoded nonce value +// dataForTestWithdrawal.nonce = 0; +// } + +// uint256[] memory strategyIndexes = new uint256[](2); +// IERC20[] memory tokensArray = new IERC20[](2); +// { +// // hardcoded values +// strategyIndexes[0] = 0; +// strategyIndexes[1] = 0; +// tokensArray[0] = weth; +// tokensArray[1] = eigenToken; +// } + +// cheats.warp(uint32(block.timestamp) + 1 days); +// cheats.roll(uint32(block.timestamp) + 1 days); + +// _testQueueWithdrawal( +// depositor, +// strategyIndexes, +// dataForTestWithdrawal.delegatorStrategies, +// dataForTestWithdrawal.delegatorShares, +// withdrawer +// ); +// uint32 queuedWithdrawalBlock = uint32(block.number); + +// //now withdrawal block time is before deregistration +// cheats.warp(uint32(block.timestamp) + 2 days); +// cheats.roll(uint32(block.timestamp) + 2 days); + +// { +// //warp past the serve until time, which is 3 days from the beginning. THis puts us at 4 days past that point +// cheats.warp(uint32(block.timestamp) + 4 days); +// cheats.roll(uint32(block.timestamp) + 4 days); + +// uint256 middlewareTimeIndex = 1; +// if (withdrawAsTokens) { +// _testCompleteQueuedWithdrawalTokens( +// depositor, +// dataForTestWithdrawal.delegatorStrategies, +// tokensArray, +// dataForTestWithdrawal.delegatorShares, +// delegatedTo, +// dataForTestWithdrawal.withdrawer, +// dataForTestWithdrawal.nonce, +// queuedWithdrawalBlock, +// middlewareTimeIndex +// ); +// } else { +// _testCompleteQueuedWithdrawalShares( +// depositor, +// dataForTestWithdrawal.delegatorStrategies, +// tokensArray, +// dataForTestWithdrawal.delegatorShares, +// delegatedTo, +// dataForTestWithdrawal.withdrawer, +// dataForTestWithdrawal.nonce, +// queuedWithdrawalBlock, +// middlewareTimeIndex +// ); +// } +// } +// } + +// /// @notice test staker's ability to undelegate/withdraw from an operator. +// /// @param operator is the operator being delegated to. +// /// @param depositor is the staker delegating stake to the operator. +// function _testWithdrawalWithStakeUpdate( +// address operator, +// address depositor, +// address withdrawer, +// uint96 ethAmount, +// uint96 eigenAmount, +// bool withdrawAsTokens +// ) public { +// _initiateDelegation(operator, depositor, ethAmount, eigenAmount); + +// // emit log_named_uint("Linked list element 1", uint256(uint160(address(generalServiceManager1)))); +// // emit log_named_uint("Linked list element 2", uint256(uint160(address(generalServiceManager2)))); +// // emit log("________________________________________________________________"); +// // emit log_named_uint("Middleware 1 Update Block", uint32(block.number)); + +// cheats.warp(uint32(block.timestamp) + 1 days); +// cheats.roll(uint32(block.number) + 1); + +// // emit log_named_uint("Middleware 2 Update Block", uint32(block.number)); + +// address delegatedTo = delegation.delegatedTo(depositor); + +// // packed data structure to deal with stack-too-deep issues +// DataForTestWithdrawal memory dataForTestWithdrawal; + +// // scoped block to deal with stack-too-deep issues +// { +// //delegator-specific information +// (IStrategy[] memory delegatorStrategies, uint256[] memory delegatorShares) = strategyManager.getDeposits( +// depositor +// ); +// dataForTestWithdrawal.delegatorStrategies = delegatorStrategies; +// dataForTestWithdrawal.delegatorShares = delegatorShares; +// dataForTestWithdrawal.withdrawer = withdrawer; +// // harcoded nonce value +// dataForTestWithdrawal.nonce = 0; +// } + +// uint256[] memory strategyIndexes = new uint256[](2); +// IERC20[] memory tokensArray = new IERC20[](2); +// { +// // hardcoded values +// strategyIndexes[0] = 0; +// strategyIndexes[1] = 0; +// tokensArray[0] = weth; +// tokensArray[1] = eigenToken; +// } + +// cheats.warp(uint32(block.timestamp) + 1 days); +// cheats.roll(uint32(block.number) + 1); + +// _testQueueWithdrawal( +// depositor, +// strategyIndexes, +// dataForTestWithdrawal.delegatorStrategies, +// dataForTestWithdrawal.delegatorShares, +// dataForTestWithdrawal.withdrawer +// ); +// uint32 queuedWithdrawalBlock = uint32(block.number); + +// //now withdrawal block time is before deregistration +// cheats.warp(uint32(block.timestamp) + 2 days); +// cheats.roll(uint32(block.number) + 2); + +// // uint256 prevElement = uint256(uint160(address(generalServiceManager2))); + +// cheats.warp(uint32(block.timestamp) + 1 days); +// cheats.roll(uint32(block.number) + 1); + +// // prevElement = uint256(uint160(address(generalServiceManager1))); + +// { +// //warp past the serve until time, which is 3 days from the beginning. THis puts us at 4 days past that point +// cheats.warp(uint32(block.timestamp) + 4 days); +// cheats.roll(uint32(block.number) + 4); + +// uint256 middlewareTimeIndex = 3; +// if (withdrawAsTokens) { +// _testCompleteQueuedWithdrawalTokens( +// depositor, +// dataForTestWithdrawal.delegatorStrategies, +// tokensArray, +// dataForTestWithdrawal.delegatorShares, +// delegatedTo, +// dataForTestWithdrawal.withdrawer, +// dataForTestWithdrawal.nonce, +// queuedWithdrawalBlock, +// middlewareTimeIndex +// ); +// } else { +// _testCompleteQueuedWithdrawalShares( +// depositor, +// dataForTestWithdrawal.delegatorStrategies, +// tokensArray, +// dataForTestWithdrawal.delegatorShares, +// delegatedTo, +// dataForTestWithdrawal.withdrawer, +// dataForTestWithdrawal.nonce, +// queuedWithdrawalBlock, +// middlewareTimeIndex +// ); +// } +// } +// } + +// // @notice This function tests to ensure that a delegator can re-delegate to an operator after undelegating. +// // @param operator is the operator being delegated to. +// // @param staker is the staker delegating stake to the operator. +// function testRedelegateAfterWithdrawal( +// address operator, +// address depositor, +// uint96 ethAmount, +// uint96 eigenAmount, +// bool withdrawAsShares +// ) public fuzzedAddress(operator) fuzzedAddress(depositor) { +// cheats.assume(depositor != operator); +// //this function performs delegation and subsequent withdrawal +// testWithdrawalWrapper(operator, depositor, ethAmount, eigenAmount, withdrawAsShares, true); + +// cheats.prank(depositor); +// delegation.undelegate(depositor); + +// //warps past fraudproof time interval +// cheats.warp(block.timestamp + 7 days + 1); +// _initiateDelegation(operator, depositor, ethAmount, eigenAmount); +// } + +// // Helper function to begin a delegation +// function _initiateDelegation( +// address operator, +// address staker, +// uint96 ethAmount, +// uint96 eigenAmount +// ) internal fuzzedAddress(operator) fuzzedAddress(staker) fuzzedAmounts(ethAmount, eigenAmount) { +// cheats.assume(staker != operator); +// // base strategy will revert if these amounts are too small on first deposit +// cheats.assume(ethAmount >= 1); +// cheats.assume(eigenAmount >= 2); + +// _testDelegation(operator, staker, ethAmount, eigenAmount); +// } + +// modifier fuzzedAmounts(uint256 ethAmount, uint256 eigenAmount) { +// cheats.assume(ethAmount >= 0 && ethAmount <= 1e18); +// cheats.assume(eigenAmount >= 0 && eigenAmount <= 1e18); +// _; +// } +// } diff --git a/src/test/events/IAVSDirectoryEvents.sol b/src/test/events/IAVSDirectoryEvents.sol index a4f0a2962..c176c0177 100644 --- a/src/test/events/IAVSDirectoryEvents.sol +++ b/src/test/events/IAVSDirectoryEvents.sol @@ -1,15 +1,31 @@ // SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.12; +pragma solidity ^0.8.27; import "src/contracts/interfaces/IAVSDirectory.sol"; interface IAVSDirectoryEvents { + /// @notice Emitted when an operator set is created by an AVS. + event OperatorSetCreated(OperatorSet operatorSet); + /** - * @notice Emitted when @param avs 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 + * @notice Emitted when an operator's registration status with an AVS id udpated + * @notice Only used by legacy M2 AVSs that have not integrated with operatorSets. */ + event OperatorAVSRegistrationStatusUpdated(address indexed operator, address indexed avs, IAVSDirectory.OperatorAVSRegistrationStatus status); + + /// @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 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's registration status for an AVS is updated - event OperatorAVSRegistrationStatusUpdated(address indexed operator, address indexed avs, IAVSDirectory.OperatorAVSRegistrationStatus status); + /// @notice Emitted when an AVS migrates to using operator sets + event AVSMigratedToOperatorSets(address indexed avs); + + /// @notice Emitted when an operator is migrated from M2 registration to operator sets. + event OperatorMigratedToOperatorSets(address indexed operator, address indexed avs, uint32[] operatorSetIds); } diff --git a/src/test/events/IDelegationManagerEvents.sol b/src/test/events/IDelegationManagerEvents.sol index 9677cc226..aaeec104f 100644 --- a/src/test/events/IDelegationManagerEvents.sol +++ b/src/test/events/IDelegationManagerEvents.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.12; +pragma solidity ^0.8.27; import "src/contracts/interfaces/IDelegationManager.sol"; diff --git a/src/test/events/IEigenPodEvents.sol b/src/test/events/IEigenPodEvents.sol index f6302272b..db649113a 100644 --- a/src/test/events/IEigenPodEvents.sol +++ b/src/test/events/IEigenPodEvents.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.12; +pragma solidity ^0.8.27; interface IEigenPodEvents { // @notice Emitted when an ETH validator stakes via this eigenPod diff --git a/src/test/events/IEigenPodManagerEvents.sol b/src/test/events/IEigenPodManagerEvents.sol index 79c11d663..c9d009fed 100644 --- a/src/test/events/IEigenPodManagerEvents.sol +++ b/src/test/events/IEigenPodManagerEvents.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.12; +pragma solidity ^0.8.27; interface IEigenPodManagerEvents { /// @notice Emitted to notify that the denebForkTimestamp has been set diff --git a/src/test/events/IRewardsCoordinatorEvents.sol b/src/test/events/IRewardsCoordinatorEvents.sol index 72832ae68..30894a91b 100644 --- a/src/test/events/IRewardsCoordinatorEvents.sol +++ b/src/test/events/IRewardsCoordinatorEvents.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.12; +pragma solidity ^0.8.27; import "src/contracts/interfaces/IRewardsCoordinator.sol"; @@ -36,6 +36,14 @@ interface IRewardsCoordinatorEvents { ); event ActivationDelaySet(uint32 oldActivationDelay, uint32 newActivationDelay); event GlobalCommissionBipsSet(uint16 oldGlobalCommissionBips, uint16 newGlobalCommissionBips); + /// @notice emitted when an operator commission is set for a specific OperatorSet + event OperatorCommissionUpdated( + address indexed operator, + OperatorSet indexed operatorSet, + IRewardsCoordinator.RewardType rewardType, + uint16 newCommissionBips, + uint32 effectTimestamp + ); 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( @@ -44,6 +52,7 @@ interface IRewardsCoordinatorEvents { uint32 indexed rewardsCalculationEndTimestamp, uint32 activatedAt ); + event DistributionRootDisabled(uint32 indexed rootIndex); /// @notice root is one of the submitted distribution roots that was claimed against event RewardsClaimed( bytes32 root, @@ -53,6 +62,14 @@ interface IRewardsCoordinatorEvents { IERC20 token, uint256 claimedAmount ); + /// @notice emitted when an AVS creates a valid OperatorSetRewardsSubmission + event OperatorSetRewardCreated( + address indexed avs, + uint256 indexed submissionNonce, + bytes32 indexed rewardsSubmissionHash, + IRewardsCoordinator.OperatorSetRewardsSubmission rewardsSubmission + ); + diff --git a/src/test/events/IStrategyManagerEvents.sol b/src/test/events/IStrategyManagerEvents.sol index e0727d069..a18ea82b2 100644 --- a/src/test/events/IStrategyManagerEvents.sol +++ b/src/test/events/IStrategyManagerEvents.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.12; +pragma solidity ^0.8.27; import "src/contracts/interfaces/IStrategyManager.sol"; @@ -46,9 +46,6 @@ interface IStrategyManagerEvents { bytes32 withdrawalRoot ); - /// @notice Emitted when `thirdPartyTransfersForbidden` is updated for a strategy and value by the owner - event UpdatedThirdPartyTransfersForbidden(IStrategy strategy, bool value); - /// @notice Emitted when the `strategyWhitelister` is changed event StrategyWhitelisterChanged(address previousAddress, address newAddress); diff --git a/src/test/harnesses/EigenHarness.sol b/src/test/harnesses/EigenHarness.sol index e5f1ccbbf..b8d11b1bc 100644 --- a/src/test/harnesses/EigenHarness.sol +++ b/src/test/harnesses/EigenHarness.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.12; +pragma solidity ^0.8.27; import "../../contracts/token/Eigen.sol"; diff --git a/src/test/harnesses/EigenPodHarness.sol b/src/test/harnesses/EigenPodHarness.sol index f76e00e1f..0be5e4a54 100644 --- a/src/test/harnesses/EigenPodHarness.sol +++ b/src/test/harnesses/EigenPodHarness.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.12; +pragma solidity ^0.8.27; import "../../contracts/pods/EigenPod.sol"; import "forge-std/Test.sol"; diff --git a/src/test/harnesses/EigenPodManagerWrapper.sol b/src/test/harnesses/EigenPodManagerWrapper.sol index 15eec05fd..7bce6e9bc 100644 --- a/src/test/harnesses/EigenPodManagerWrapper.sol +++ b/src/test/harnesses/EigenPodManagerWrapper.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.12; +pragma solidity ^0.8.27; import "../../contracts/pods/EigenPodManager.sol"; diff --git a/src/test/harnesses/PausableHarness.sol b/src/test/harnesses/PausableHarness.sol index 7a0e37fdb..895bf2e85 100644 --- a/src/test/harnesses/PausableHarness.sol +++ b/src/test/harnesses/PausableHarness.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.12; +pragma solidity ^0.8.27; import "../../contracts/permissions/Pausable.sol"; diff --git a/src/test/integration/IntegrationBase.t.sol b/src/test/integration/IntegrationBase.t.sol index dc232a98c..86ef59b54 100644 --- a/src/test/integration/IntegrationBase.t.sol +++ b/src/test/integration/IntegrationBase.t.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.12; +pragma solidity ^0.8.27; import "forge-std/Test.sol"; @@ -1003,7 +1003,8 @@ abstract contract IntegrationBase is IntegrationDeployer { // blocksToRoll = withdrawalDelayBlocks; // } // } - cheats.roll(block.number + delegationManager.getWithdrawalDelay(strategies)); + // TODO: Fix this with withdrawal changes + // cheats.roll(block.number + delegationManager.getWithdrawalDelay(strategies)); } /// @dev Uses timewarp modifier to get operator shares at the last snapshot diff --git a/src/test/integration/IntegrationChecks.t.sol b/src/test/integration/IntegrationChecks.t.sol index 2fc360581..adedd55f3 100644 --- a/src/test/integration/IntegrationChecks.t.sol +++ b/src/test/integration/IntegrationChecks.t.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.12; +pragma solidity ^0.8.27; import "src/test/integration/IntegrationBase.t.sol"; import "src/test/integration/users/User.t.sol"; @@ -266,11 +266,11 @@ contract IntegrationCheckUtils is IntegrationBase { if (operator != staker) { assert_Snap_Unchanged_TokenBalances(User(operator), "operator should not have any change in underlying token balances"); } - assert_Snap_Added_OperatorShares(User(operator), withdrawal.strategies, withdrawal.shares, "operator should have received shares"); + assert_Snap_Added_OperatorShares(User(operator), withdrawal.strategies, withdrawal.scaledShares, "operator should have received scaledShares"); } } - /// @notice Difference from above is that operator shares do not increase since staker is not delegated + /// @notice Difference from above is that operator scaledShares do not increase since staker is not delegated function check_Withdrawal_AsShares_Undelegated_State( User staker, User operator, diff --git a/src/test/integration/IntegrationDeployer.t.sol b/src/test/integration/IntegrationDeployer.t.sol index 8181a3ee7..8703908b5 100644 --- a/src/test/integration/IntegrationDeployer.t.sol +++ b/src/test/integration/IntegrationDeployer.t.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.12; +pragma solidity ^0.8.27; // Imports import "@openzeppelin/contracts/token/ERC20/presets/ERC20PresetFixedSupply.sol"; @@ -256,8 +256,15 @@ abstract contract IntegrationDeployer is ExistingDeploymentParser { eigenPodBeacon = new UpgradeableBeacon(address(eigenPodImplementation)); // Second, deploy the *implementation* contracts, using the *proxy contracts* as inputs - delegationManagerImplementation = new DelegationManager(strategyManager, slasher, eigenPodManager); - strategyManagerImplementation = new StrategyManager(delegationManager, eigenPodManager, slasher); + delegationManagerImplementation = new DelegationManager( + strategyManager, + slasher, + eigenPodManager, + avsDirectory, + allocationManager, + MIN_WITHDRAWAL_DELAY + ); + strategyManagerImplementation = new StrategyManager(delegationManager, eigenPodManager, slasher, avsDirectory); slasherImplementation = new Slasher(strategyManager, delegationManager); eigenPodManagerImplementation = new EigenPodManager( ethPOSDeposit, @@ -399,8 +406,15 @@ abstract contract IntegrationDeployer is ExistingDeploymentParser { ); // First, deploy the *implementation* contracts, using the *proxy contracts* as inputs - delegationManagerImplementation = new DelegationManager(strategyManager, slasher, eigenPodManager); - strategyManagerImplementation = new StrategyManager(delegationManager, eigenPodManager, slasher); + delegationManagerImplementation = new DelegationManager( + strategyManager, + slasher, + eigenPodManager, + avsDirectory, + allocationManager, + MIN_WITHDRAWAL_DELAY + ); + strategyManagerImplementation = new StrategyManager(delegationManager, eigenPodManager, slasher, avsDirectory); slasherImplementation = new Slasher(strategyManager, delegationManager); eigenPodManagerImplementation = new EigenPodManager( ethPOSDeposit, @@ -493,8 +507,15 @@ abstract contract IntegrationDeployer is ExistingDeploymentParser { ); // First, deploy the *implementation* contracts, using the *proxy contracts* as inputs - delegationManagerImplementation = new DelegationManager(strategyManager, slasher, eigenPodManager); - strategyManagerImplementation = new StrategyManager(delegationManager, eigenPodManager, slasher); + delegationManagerImplementation = new DelegationManager( + strategyManager, + slasher, + eigenPodManager, + avsDirectory, + allocationManager, + MIN_WITHDRAWAL_DELAY + ); + strategyManagerImplementation = new StrategyManager(delegationManager, eigenPodManager, slasher, avsDirectory); slasherImplementation = new Slasher(strategyManager, delegationManager); eigenPodManagerImplementation = new EigenPodManager( ethPOSDeposit, @@ -589,7 +610,6 @@ abstract contract IntegrationDeployer is ExistingDeploymentParser { // Whitelist strategy IStrategy[] memory strategies = new IStrategy[](1); - bool[] memory _thirdPartyTransfersForbiddenValues = new bool[](1); strategies[0] = strategy; if (forkType == MAINNET) { @@ -599,7 +619,7 @@ abstract contract IntegrationDeployer is ExistingDeploymentParser { StrategyBaseTVLLimits(address(strategy)).setTVLLimits(type(uint256).max, type(uint256).max); } else { cheats.prank(strategyManager.strategyWhitelister()); - strategyManager.addStrategiesToDepositWhitelist(strategies, _thirdPartyTransfersForbiddenValues); + strategyManager.addStrategiesToDepositWhitelist(strategies); } // Add to lstStrats and allStrats diff --git a/src/test/integration/TimeMachine.t.sol b/src/test/integration/TimeMachine.t.sol index aabb47d4b..253d48cc0 100644 --- a/src/test/integration/TimeMachine.t.sol +++ b/src/test/integration/TimeMachine.t.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.12; +pragma solidity ^0.8.27; import "forge-std/Test.sol"; diff --git a/src/test/integration/deprecatedInterfaces/mainnet/BeaconChainProofs.sol b/src/test/integration/deprecatedInterfaces/mainnet/BeaconChainProofs.sol index 89af42013..41c8a043d 100644 --- a/src/test/integration/deprecatedInterfaces/mainnet/BeaconChainProofs.sol +++ b/src/test/integration/deprecatedInterfaces/mainnet/BeaconChainProofs.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.12; +pragma solidity ^0.8.27; import "src/contracts/libraries/Merkle.sol"; import "src/contracts/libraries/Endian.sol"; diff --git a/src/test/integration/deprecatedInterfaces/mainnet/IBeaconChainOracle.sol b/src/test/integration/deprecatedInterfaces/mainnet/IBeaconChainOracle.sol index 2bb2c818e..cb36eda5b 100644 --- a/src/test/integration/deprecatedInterfaces/mainnet/IBeaconChainOracle.sol +++ b/src/test/integration/deprecatedInterfaces/mainnet/IBeaconChainOracle.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.12; +pragma solidity ^0.8.27; /** * @notice DEPRECATED INTERFACE at commit hash https://github.com/Layr-Labs/eigenlayer-contracts/tree/0139d6213927c0a7812578899ddd3dda58051928 diff --git a/src/test/integration/deprecatedInterfaces/mainnet/IDelayedWithdrawalRouter.sol b/src/test/integration/deprecatedInterfaces/mainnet/IDelayedWithdrawalRouter.sol index 8abb54a86..06d66c1e6 100644 --- a/src/test/integration/deprecatedInterfaces/mainnet/IDelayedWithdrawalRouter.sol +++ b/src/test/integration/deprecatedInterfaces/mainnet/IDelayedWithdrawalRouter.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.12; +pragma solidity ^0.8.27; /// @notice DEPRECATED INTERFACE at commit hash https://github.com/Layr-Labs/eigenlayer-contracts/tree/0139d6213927c0a7812578899ddd3dda58051928 interface IDelayedWithdrawalRouter_DeprecatedM1 { diff --git a/src/test/integration/deprecatedInterfaces/mainnet/IEigenPod.sol b/src/test/integration/deprecatedInterfaces/mainnet/IEigenPod.sol index 0171653be..2866a9b83 100644 --- a/src/test/integration/deprecatedInterfaces/mainnet/IEigenPod.sol +++ b/src/test/integration/deprecatedInterfaces/mainnet/IEigenPod.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.12; +pragma solidity ^0.8.27; import "./BeaconChainProofs.sol"; import "./IEigenPodManager.sol"; diff --git a/src/test/integration/deprecatedInterfaces/mainnet/IEigenPodManager.sol b/src/test/integration/deprecatedInterfaces/mainnet/IEigenPodManager.sol index d5795bf5d..311798e17 100644 --- a/src/test/integration/deprecatedInterfaces/mainnet/IEigenPodManager.sol +++ b/src/test/integration/deprecatedInterfaces/mainnet/IEigenPodManager.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.12; +pragma solidity ^0.8.27; import "./IStrategyManager.sol"; import "./IEigenPod.sol"; diff --git a/src/test/integration/deprecatedInterfaces/mainnet/IStrategyManager.sol b/src/test/integration/deprecatedInterfaces/mainnet/IStrategyManager.sol index be5745683..dec934d1b 100644 --- a/src/test/integration/deprecatedInterfaces/mainnet/IStrategyManager.sol +++ b/src/test/integration/deprecatedInterfaces/mainnet/IStrategyManager.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.12; +pragma solidity ^0.8.27; import "src/contracts/interfaces/IStrategy.sol"; import "src/contracts/interfaces/ISlasher.sol"; diff --git a/src/test/integration/mocks/BeaconChainMock.t.sol b/src/test/integration/mocks/BeaconChainMock.t.sol index 81958fef8..0ed38503d 100644 --- a/src/test/integration/mocks/BeaconChainMock.t.sol +++ b/src/test/integration/mocks/BeaconChainMock.t.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.12; +pragma solidity ^0.8.27; import "forge-std/Test.sol"; diff --git a/src/test/integration/mocks/EIP_4788_Oracle_Mock.t.sol b/src/test/integration/mocks/EIP_4788_Oracle_Mock.t.sol index b83aac72a..37cb50c59 100644 --- a/src/test/integration/mocks/EIP_4788_Oracle_Mock.t.sol +++ b/src/test/integration/mocks/EIP_4788_Oracle_Mock.t.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.12; +pragma solidity ^0.8.27; contract EIP_4788_Oracle_Mock { diff --git a/src/test/integration/tests/Delegate_Deposit_Queue_Complete.t.sol b/src/test/integration/tests/Delegate_Deposit_Queue_Complete.t.sol index 1c20e1807..97afbaf74 100644 --- a/src/test/integration/tests/Delegate_Deposit_Queue_Complete.t.sol +++ b/src/test/integration/tests/Delegate_Deposit_Queue_Complete.t.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.12; +pragma solidity ^0.8.27; import "src/test/integration/IntegrationChecks.t.sol"; import "src/test/integration/users/User.t.sol"; diff --git a/src/test/integration/tests/Deposit_Delegate_Queue_Complete.t.sol b/src/test/integration/tests/Deposit_Delegate_Queue_Complete.t.sol index 7a703dea9..2757f6aa8 100644 --- a/src/test/integration/tests/Deposit_Delegate_Queue_Complete.t.sol +++ b/src/test/integration/tests/Deposit_Delegate_Queue_Complete.t.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.12; +pragma solidity ^0.8.27; import "src/test/integration/IntegrationChecks.t.sol"; import "src/test/integration/users/User.t.sol"; @@ -60,7 +60,7 @@ contract Integration_Deposit_Delegate_Queue_Complete is IntegrationCheckUtils { _rollBlocksForCompleteWithdrawals(strategies); for (uint256 i = 0; i < withdrawals.length; i++) { - uint256[] memory expectedTokens = _calculateExpectedTokens(withdrawals[i].strategies, withdrawals[i].shares); + uint256[] memory expectedTokens = _calculateExpectedTokens(withdrawals[i].strategies, withdrawals[i].scaledShares); IERC20[] memory tokens = staker.completeWithdrawalAsTokens(withdrawals[i]); check_Withdrawal_AsTokens_State(staker, operator, withdrawals[i], strategies, shares, tokens, expectedTokens); } @@ -192,7 +192,7 @@ contract Integration_Deposit_Delegate_Queue_Complete is IntegrationCheckUtils { // Fast forward to when we can complete the withdrawal _rollBlocksForCompleteWithdrawals(strategies); for (uint256 i = 0; i < withdrawals.length; i++) { - uint256[] memory expectedTokens = _calculateExpectedTokens(withdrawals[i].strategies, withdrawals[i].shares); + uint256[] memory expectedTokens = _calculateExpectedTokens(withdrawals[i].strategies, withdrawals[i].scaledShares); IERC20[] memory tokens = staker.completeWithdrawalAsTokens(withdrawals[i]); check_Withdrawal_AsTokens_State(staker, operator, withdrawals[i], withdrawStrats, withdrawShares, tokens, expectedTokens); } diff --git a/src/test/integration/tests/Deposit_Delegate_Redelegate_Complete.t.sol b/src/test/integration/tests/Deposit_Delegate_Redelegate_Complete.t.sol index e5bc6b91d..3203e9619 100644 --- a/src/test/integration/tests/Deposit_Delegate_Redelegate_Complete.t.sol +++ b/src/test/integration/tests/Deposit_Delegate_Redelegate_Complete.t.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.12; +pragma solidity ^0.8.27; import "src/test/integration/users/User.t.sol"; import "src/test/integration/IntegrationChecks.t.sol"; @@ -60,7 +60,7 @@ contract Integration_Deposit_Delegate_Redelegate_Complete is IntegrationCheckUti _rollBlocksForCompleteWithdrawals(strategies); for (uint256 i = 0; i < withdrawals.length; ++i) { staker.completeWithdrawalAsShares(withdrawals[i]); - check_Withdrawal_AsShares_Undelegated_State(staker, operator1, withdrawals[i], withdrawals[i].strategies, withdrawals[i].shares); + check_Withdrawal_AsShares_Undelegated_State(staker, operator1, withdrawals[i], withdrawals[i].strategies, withdrawals[i].scaledShares); } // 5. Delegate to a new operator @@ -79,9 +79,9 @@ contract Integration_Deposit_Delegate_Redelegate_Complete is IntegrationCheckUti // Complete withdrawals for (uint i = 0; i < withdrawals.length; i++) { - uint[] memory expectedTokens = _calculateExpectedTokens(withdrawals[i].strategies, withdrawals[i].shares); + uint[] memory expectedTokens = _calculateExpectedTokens(withdrawals[i].strategies, withdrawals[i].scaledShares); IERC20[] memory tokens = staker.completeWithdrawalAsTokens(withdrawals[i]); - check_Withdrawal_AsTokens_State(staker, operator2, withdrawals[i], withdrawals[i].strategies, withdrawals[i].shares, tokens, expectedTokens); + check_Withdrawal_AsTokens_State(staker, operator2, withdrawals[i], withdrawals[i].strategies, withdrawals[i].scaledShares, tokens, expectedTokens); } } @@ -132,7 +132,7 @@ contract Integration_Deposit_Delegate_Redelegate_Complete is IntegrationCheckUti _rollBlocksForCompleteWithdrawals(strategies); for (uint256 i = 0; i < withdrawals.length; ++i) { staker.completeWithdrawalAsShares(withdrawals[i]); - check_Withdrawal_AsShares_Undelegated_State(staker, operator1, withdrawals[i], withdrawals[i].strategies, withdrawals[i].shares); + check_Withdrawal_AsShares_Undelegated_State(staker, operator1, withdrawals[i], withdrawals[i].strategies, withdrawals[i].scaledShares); } // 5. Delegate to a new operator @@ -227,7 +227,7 @@ contract Integration_Deposit_Delegate_Redelegate_Complete is IntegrationCheckUti _rollBlocksForCompleteWithdrawals(strategies); for (uint256 i = 0; i < withdrawals.length; ++i) { staker.completeWithdrawalAsShares(withdrawals[i]); - check_Withdrawal_AsShares_Undelegated_State(staker, operator1, withdrawals[i], withdrawals[i].strategies, withdrawals[i].shares); + check_Withdrawal_AsShares_Undelegated_State(staker, operator1, withdrawals[i], withdrawals[i].strategies, withdrawals[i].scaledShares); } // 5. Delegate to a new operator @@ -255,7 +255,7 @@ contract Integration_Deposit_Delegate_Redelegate_Complete is IntegrationCheckUti // Complete withdrawals for (uint i = 0; i < newWithdrawals.length; i++) { - uint[] memory expectedTokens = _calculateExpectedTokens(newWithdrawals[i].strategies, newWithdrawals[i].shares); + uint[] memory expectedTokens = _calculateExpectedTokens(newWithdrawals[i].strategies, newWithdrawals[i].scaledShares); IERC20[] memory tokens = staker.completeWithdrawalAsTokens(newWithdrawals[i]); check_Withdrawal_AsTokens_State(staker, operator2, newWithdrawals[i], strategies, shares, tokens, expectedTokens); } @@ -319,7 +319,7 @@ contract Integration_Deposit_Delegate_Redelegate_Complete is IntegrationCheckUti _rollBlocksForCompleteWithdrawals(strategies); for (uint256 i = 0; i < withdrawals.length; ++i) { staker.completeWithdrawalAsShares(withdrawals[i]); - check_Withdrawal_AsShares_Undelegated_State(staker, operator1, withdrawals[i], withdrawals[i].strategies, withdrawals[i].shares); + check_Withdrawal_AsShares_Undelegated_State(staker, operator1, withdrawals[i], withdrawals[i].strategies, withdrawals[i].scaledShares); } // 5. Deposit into Strategies @@ -347,7 +347,7 @@ contract Integration_Deposit_Delegate_Redelegate_Complete is IntegrationCheckUti // Complete withdrawals for (uint i = 0; i < newWithdrawals.length; i++) { - uint[] memory expectedTokens = _calculateExpectedTokens(newWithdrawals[i].strategies, newWithdrawals[i].shares); + uint[] memory expectedTokens = _calculateExpectedTokens(newWithdrawals[i].strategies, newWithdrawals[i].scaledShares); IERC20[] memory tokens = staker.completeWithdrawalAsTokens(newWithdrawals[i]); check_Withdrawal_AsTokens_State(staker, operator2, newWithdrawals[i], strategies, shares, tokens, expectedTokens); } @@ -396,9 +396,9 @@ contract Integration_Deposit_Delegate_Redelegate_Complete is IntegrationCheckUti // Fast forward to when we can complete the withdrawal _rollBlocksForCompleteWithdrawals(strategies); for (uint256 i = 0; i < withdrawals.length; ++i) { - uint[] memory expectedTokens = _calculateExpectedTokens(withdrawals[i].strategies, withdrawals[i].shares); + uint[] memory expectedTokens = _calculateExpectedTokens(withdrawals[i].strategies, withdrawals[i].scaledShares); IERC20[] memory tokens = staker.completeWithdrawalAsTokens(withdrawals[i]); - check_Withdrawal_AsTokens_State(staker, operator1, withdrawals[i], withdrawals[i].strategies, withdrawals[i].shares, tokens, expectedTokens); + check_Withdrawal_AsTokens_State(staker, operator1, withdrawals[i], withdrawals[i].strategies, withdrawals[i].scaledShares, tokens, expectedTokens); } //5. Deposit into Strategies @@ -422,7 +422,7 @@ contract Integration_Deposit_Delegate_Redelegate_Complete is IntegrationCheckUti // Complete withdrawals as tokens for (uint i = 0; i < withdrawals.length; i++) { - uint[] memory expectedTokens = _calculateExpectedTokens(withdrawals[i].strategies, withdrawals[i].shares); + uint[] memory expectedTokens = _calculateExpectedTokens(withdrawals[i].strategies, withdrawals[i].scaledShares); IERC20[] memory tokens = staker.completeWithdrawalAsTokens(withdrawals[i]); check_Withdrawal_AsTokens_State(staker, operator2, withdrawals[i], strategies, shares, tokens, expectedTokens); } @@ -470,9 +470,9 @@ contract Integration_Deposit_Delegate_Redelegate_Complete is IntegrationCheckUti // Fast forward to when we can complete the withdrawal _rollBlocksForCompleteWithdrawals(strategies); for (uint256 i = 0; i < withdrawals.length; ++i) { - uint[] memory expectedTokens = _calculateExpectedTokens(withdrawals[i].strategies, withdrawals[i].shares); + uint[] memory expectedTokens = _calculateExpectedTokens(withdrawals[i].strategies, withdrawals[i].scaledShares); IERC20[] memory tokens = staker.completeWithdrawalAsTokens(withdrawals[i]); - check_Withdrawal_AsTokens_State(staker, operator1, withdrawals[i], withdrawals[i].strategies, withdrawals[i].shares, tokens, expectedTokens); + check_Withdrawal_AsTokens_State(staker, operator1, withdrawals[i], withdrawals[i].strategies, withdrawals[i].scaledShares, tokens, expectedTokens); } //5. Deposit into Strategies diff --git a/src/test/integration/tests/Deposit_Delegate_Undelegate_Complete.t.sol b/src/test/integration/tests/Deposit_Delegate_Undelegate_Complete.t.sol index 9307eb358..4fbcda006 100644 --- a/src/test/integration/tests/Deposit_Delegate_Undelegate_Complete.t.sol +++ b/src/test/integration/tests/Deposit_Delegate_Undelegate_Complete.t.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.12; +pragma solidity ^0.8.27; import "src/test/integration/users/User.t.sol"; import "src/test/integration/IntegrationChecks.t.sol"; @@ -58,9 +58,9 @@ contract Integration_Deposit_Delegate_Undelegate_Complete is IntegrationCheckUti // Complete withdrawal for (uint256 i = 0; i < withdrawals.length; ++i) { - uint[] memory expectedTokens = _calculateExpectedTokens(withdrawals[i].strategies, withdrawals[i].shares); + uint[] memory expectedTokens = _calculateExpectedTokens(withdrawals[i].strategies, withdrawals[i].scaledShares); IERC20[] memory tokens = staker.completeWithdrawalAsTokens(withdrawals[i]); - check_Withdrawal_AsTokens_State(staker, operator, withdrawals[i], withdrawals[i].strategies, withdrawals[i].shares, tokens, expectedTokens); + check_Withdrawal_AsTokens_State(staker, operator, withdrawals[i], withdrawals[i].strategies, withdrawals[i].scaledShares, tokens, expectedTokens); } // Check Final State @@ -121,7 +121,7 @@ contract Integration_Deposit_Delegate_Undelegate_Complete is IntegrationCheckUti for (uint256 i = 0; i < withdrawals.length; ++i) { staker.completeWithdrawalAsShares(withdrawals[i]); - check_Withdrawal_AsShares_Undelegated_State(staker, operator, withdrawals[i], withdrawals[i].strategies, withdrawals[i].shares); + check_Withdrawal_AsShares_Undelegated_State(staker, operator, withdrawals[i], withdrawals[i].strategies, withdrawals[i].scaledShares); } // Check final state: @@ -176,9 +176,9 @@ contract Integration_Deposit_Delegate_Undelegate_Complete is IntegrationCheckUti _rollBlocksForCompleteWithdrawals(strategies); for (uint256 i = 0; i < withdrawals.length; ++i) { - uint[] memory expectedTokens = _calculateExpectedTokens(withdrawals[i].strategies, withdrawals[i].shares); + uint[] memory expectedTokens = _calculateExpectedTokens(withdrawals[i].strategies, withdrawals[i].scaledShares); IERC20[] memory tokens = staker.completeWithdrawalAsTokens(withdrawals[i]); - check_Withdrawal_AsTokens_State(staker, operator, withdrawals[i], withdrawals[i].strategies, withdrawals[i].shares, tokens, expectedTokens); + check_Withdrawal_AsTokens_State(staker, operator, withdrawals[i], withdrawals[i].strategies, withdrawals[i].scaledShares, tokens, expectedTokens); } // Check Final State @@ -233,7 +233,7 @@ contract Integration_Deposit_Delegate_Undelegate_Complete is IntegrationCheckUti _rollBlocksForCompleteWithdrawals(strategies); for (uint256 i = 0; i < withdrawals.length; ++i) { staker.completeWithdrawalAsShares(withdrawals[i]); - check_Withdrawal_AsShares_Undelegated_State(staker, operator, withdrawals[i], withdrawals[i].strategies, withdrawals[i].shares); + check_Withdrawal_AsShares_Undelegated_State(staker, operator, withdrawals[i], withdrawals[i].strategies, withdrawals[i].scaledShares); } // Check final state: diff --git a/src/test/integration/tests/Deposit_Delegate_UpdateBalance.t.sol b/src/test/integration/tests/Deposit_Delegate_UpdateBalance.t.sol index 53b42ff4a..16655a324 100644 --- a/src/test/integration/tests/Deposit_Delegate_UpdateBalance.t.sol +++ b/src/test/integration/tests/Deposit_Delegate_UpdateBalance.t.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.12; +pragma solidity ^0.8.27; import "src/test/integration/IntegrationChecks.t.sol"; import "src/test/integration/users/User.t.sol"; diff --git a/src/test/integration/tests/Deposit_Queue_Complete.t.sol b/src/test/integration/tests/Deposit_Queue_Complete.t.sol index 3260cf32c..9223b27ec 100644 --- a/src/test/integration/tests/Deposit_Queue_Complete.t.sol +++ b/src/test/integration/tests/Deposit_Queue_Complete.t.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.12; +pragma solidity ^0.8.27; import "src/test/integration/users/User.t.sol"; import "src/test/integration/IntegrationChecks.t.sol"; diff --git a/src/test/integration/tests/Deposit_Register_QueueWithdrawal_Complete.t.sol b/src/test/integration/tests/Deposit_Register_QueueWithdrawal_Complete.t.sol index 9da5443a1..0e89737e3 100644 --- a/src/test/integration/tests/Deposit_Register_QueueWithdrawal_Complete.t.sol +++ b/src/test/integration/tests/Deposit_Register_QueueWithdrawal_Complete.t.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.12; +pragma solidity ^0.8.27; import "src/test/integration/users/User.t.sol"; import "src/test/integration/IntegrationChecks.t.sol"; diff --git a/src/test/integration/tests/Upgrade_Setup.t.sol b/src/test/integration/tests/Upgrade_Setup.t.sol index cbfb4eb45..dbde22584 100644 --- a/src/test/integration/tests/Upgrade_Setup.t.sol +++ b/src/test/integration/tests/Upgrade_Setup.t.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.12; +pragma solidity ^0.8.27; import "src/test/integration/IntegrationChecks.t.sol"; diff --git a/src/test/integration/tests/eigenpod/VerifyWC_StartCP_CompleteCP.t.sol b/src/test/integration/tests/eigenpod/VerifyWC_StartCP_CompleteCP.t.sol index fd641bab2..1681c1791 100644 --- a/src/test/integration/tests/eigenpod/VerifyWC_StartCP_CompleteCP.t.sol +++ b/src/test/integration/tests/eigenpod/VerifyWC_StartCP_CompleteCP.t.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.12; +pragma solidity ^0.8.27; import "src/test/integration/IntegrationChecks.t.sol"; import "src/test/integration/users/User.t.sol"; diff --git a/src/test/integration/users/User.t.sol b/src/test/integration/users/User.t.sol index 7875e56c6..f3da74c19 100644 --- a/src/test/integration/users/User.t.sol +++ b/src/test/integration/users/User.t.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.12; +pragma solidity ^0.8.27; import "forge-std/Test.sol"; @@ -85,7 +85,7 @@ contract User is PrintUtils { stakerOptOutWindowBlocks: 0 }); - delegationManager.registerAsOperator(details, "metadata"); + delegationManager.registerAsOperator(details, 0, "metadata"); } /// @dev Delegate to the operator without a signature @@ -107,7 +107,7 @@ contract User is PrintUtils { emit log("expecting withdrawal:"); emit log_named_uint("nonce: ", expectedWithdrawals[i].nonce); emit log_named_address("strat: ", address(expectedWithdrawals[i].strategies[0])); - emit log_named_uint("shares: ", expectedWithdrawals[i].shares[0]); + emit log_named_uint("slashingShares: ", expectedWithdrawals[i].slashingShares[0]); } return expectedWithdrawals; @@ -125,7 +125,7 @@ contract User is PrintUtils { /// @dev Queues a single withdrawal for every share and strategy pair function queueWithdrawals( IStrategy[] memory strategies, - uint[] memory shares + uint[] memory scaledShares ) public createSnapshot virtual returns (IDelegationManager.Withdrawal[] memory) { _logM("queueWithdrawals"); @@ -137,7 +137,7 @@ contract User is PrintUtils { IDelegationManager.QueuedWithdrawalParams[] memory params = new IDelegationManager.QueuedWithdrawalParams[](1); params[0] = IDelegationManager.QueuedWithdrawalParams({ strategies: strategies, - shares: shares, + shares: scaledShares, withdrawer: withdrawer }); @@ -148,9 +148,9 @@ contract User is PrintUtils { delegatedTo: operator, withdrawer: withdrawer, nonce: nonce, - startBlock: uint32(block.number), + startTimestamp: uint32(block.number), //TODO strategies: strategies, - shares: shares + scaledShares: scaledShares }); bytes32[] memory withdrawalRoots = delegationManager.queueWithdrawals(params); @@ -339,7 +339,7 @@ contract User is PrintUtils { } } - delegationManager.completeQueuedWithdrawal(withdrawal, tokens, 0, receiveAsTokens); + delegationManager.completeQueuedWithdrawal(withdrawal, tokens, receiveAsTokens); return tokens; } @@ -467,7 +467,7 @@ contract User is PrintUtils { /// @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 (IDelegationManager.Withdrawal[] memory) { - (IStrategy[] memory strategies, uint256[] memory shares) + (IStrategy[] memory strategies, uint256[] memory scaledShares) = delegationManager.getDelegatableShares(staker); IDelegationManager.Withdrawal[] memory expectedWithdrawals = new IDelegationManager.Withdrawal[](strategies.length); @@ -478,15 +478,15 @@ contract User is PrintUtils { IStrategy[] memory singleStrategy = new IStrategy[](1); uint256[] memory singleShares = new uint256[](1); singleStrategy[0] = strategies[i]; - singleShares[0] = shares[i]; + singleShares[0] = scaledShares[i]; expectedWithdrawals[i] = IDelegationManager.Withdrawal({ staker: staker, delegatedTo: delegatedTo, withdrawer: staker, nonce: (nonce + i), - startBlock: uint32(block.number), + startTimestamp: uint32(block.number), //TODO fix strategies: singleStrategy, - shares: singleShares + scaledShares: singleShares }); } diff --git a/src/test/integration/users/User_M1.t.sol b/src/test/integration/users/User_M1.t.sol index 3f914cfaf..4f88a41af 100644 --- a/src/test/integration/users/User_M1.t.sol +++ b/src/test/integration/users/User_M1.t.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.12; +pragma solidity ^0.8.27; import "src/test/integration/deprecatedInterfaces/mainnet/IEigenPod.sol"; import "src/test/integration/deprecatedInterfaces/mainnet/IEigenPodManager.sol"; diff --git a/src/test/integration/utils/PrintUtils.t.sol b/src/test/integration/utils/PrintUtils.t.sol index c80dd42ff..5f4aac5d2 100644 --- a/src/test/integration/utils/PrintUtils.t.sol +++ b/src/test/integration/utils/PrintUtils.t.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.12; +pragma solidity ^0.8.27; import "forge-std/Test.sol"; diff --git a/src/test/mocks/AVSDirectoryMock.sol b/src/test/mocks/AVSDirectoryMock.sol new file mode 100644 index 000000000..a5475f60f --- /dev/null +++ b/src/test/mocks/AVSDirectoryMock.sol @@ -0,0 +1,127 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.9; + +import "forge-std/Test.sol"; +import "../../contracts/interfaces/IAVSDirectory.sol"; +import "../../contracts/interfaces/IStrategy.sol"; + +contract AVSDirectoryMock is IAVSDirectory, Test { + function createOperatorSets(uint32[] calldata operatorSetIds) external {} + + function becomeOperatorSetAVS() external {} + + function migrateOperatorsToOperatorSets( + address[] calldata operators, + uint32[][] calldata operatorSetIds + ) external {} + + function registerOperatorToOperatorSets( + address operator, + uint32[] calldata operatorSetIds, + ISignatureUtils.SignatureWithSaltAndExpiry memory operatorSignature + ) external {} + + function deregisterOperatorFromOperatorSets(address operator, uint32[] calldata operatorSetIds) external {} + + function forceDeregisterFromOperatorSets( + address operator, + address avs, + uint32[] calldata operatorSetIds, + ISignatureUtils.SignatureWithSaltAndExpiry memory operatorSignature + ) external {} + + function registerOperatorToAVS( + address operator, + ISignatureUtils.SignatureWithSaltAndExpiry memory operatorSignature + ) external {} + + function deregisterOperatorFromAVS(address operator) external {} + + function updateFreeMagnitude( + address operator, + IStrategy[] calldata strategies, + uint16[] calldata freeMagnitudes + ) external {} + + function slashOperator( + address operator, + uint32 operatorSetId, + IStrategy[] calldata strategies, + uint16 bipsToSlash + ) external {} + + function updateAVSMetadataURI(string calldata metadataURI) external {} + + function cancelSalt(bytes32 salt) external {} + + function operatorSaltIsSpent(address operator, bytes32 salt) external view returns (bool) {} + + function isMember(address avs, address operator, uint32 operatorSetId) external view returns (bool) {} + + function isOperatorSetAVS(address avs) external view returns (bool) {} + + function isOperatorSet(address avs, uint32 operatorSetId) external view returns (bool) {} + + function isOperatorSlashable(address operator, OperatorSet memory operatorSet) external view returns (bool) {} + + function operatorSetMemberCount(address avs, uint32 operatorSetId) external view returns (uint256) {} + + function calculateOperatorAVSRegistrationDigestHash( + address operator, + address avs, + bytes32 salt, + uint256 expiry + ) external view returns (bytes32) {} + + function calculateOperatorSetRegistrationDigestHash( + address avs, + uint32[] calldata operatorSetIds, + bytes32 salt, + uint256 expiry + ) external view returns (bytes32) {} + + function calculateOperatorSetForceDeregistrationTypehash( + address avs, + uint32[] calldata operatorSetIds, + bytes32 salt, + uint256 expiry + ) 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. + function domainSeparator() external view returns (bytes32) {} + + /// @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) {} + + function isMember(address operator, OperatorSet memory operatorSet) external view returns (bool) {} + + function operatorSetsMemberOfAtIndex(address operator, uint256 index) external view returns (OperatorSet memory) {} + + function operatorSetMemberAtIndex(OperatorSet memory operatorSet, uint256 index) external view returns (address) {} + + function getOperatorSetsOfOperator( + address operator, + uint256 start, + uint256 length + ) external view returns (OperatorSet[] memory operatorSets) {} + + function getOperatorsInOperatorSet( + OperatorSet memory operatorSet, + uint256 start, + uint256 length + ) external view returns (address[] memory operators) {} + + function getNumOperatorsInOperatorSet(OperatorSet memory operatorSet) external view returns (uint256) {} + + function inTotalOperatorSets(address operator) external view returns (uint256) {} + + function operatorSetStatus( + address avs, + address operator, + uint32 operatorSetId + ) external view returns (bool registered, uint32 lastDeregisteredTimestamp) {} +} \ No newline at end of file diff --git a/src/test/mocks/DelegationManagerMock.sol b/src/test/mocks/DelegationManagerMock.sol index 4fa56d087..a72b830ab 100644 --- a/src/test/mocks/DelegationManagerMock.sol +++ b/src/test/mocks/DelegationManagerMock.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.12; +pragma solidity ^0.8.27; import "forge-std/Test.sol"; import "../../contracts/interfaces/IDelegationManager.sol"; @@ -10,6 +10,9 @@ contract DelegationManagerMock is IDelegationManager, Test { mapping(address => bool) public isOperator; mapping(address => mapping(IStrategy => uint256)) public operatorShares; + + function operatorDelegatedShares(address operator, IStrategy strategy) external view returns (uint256) {} + function setIsOperator(address operator, bool _isOperatorReturnValue) external { isOperator[operator] = _isOperatorReturnValue; } @@ -19,9 +22,20 @@ contract DelegationManagerMock is IDelegationManager, Test { operatorShares[operator][strategy] = shares; } + function getOperatorScaledShares( + address operator, + IStrategy[] memory strategies + ) external view returns (uint256[] memory) {} + mapping (address => address) public delegatedTo; - function registerAsOperator(OperatorDetails calldata /*registeringOperatorDetails*/, string calldata /*metadataURI*/) external pure {} + function registerAsOperator( + OperatorDetails calldata /*registeringOperatorDetails*/, + uint32, + string calldata /*metadataURI*/ + ) external pure {} + + function initializeAllocationDelay(uint32 /*delay*/) external {} function updateOperatorMetadataURI(string calldata /*metadataURI*/) external pure {} @@ -46,13 +60,14 @@ contract DelegationManagerMock is IDelegationManager, Test { return withdrawalRoot; } - function increaseDelegatedShares(address /*staker*/, IStrategy /*strategy*/, uint256 /*shares*/) external pure {} - - function decreaseDelegatedShares( - address /*staker*/, - IStrategy /*strategy*/, - uint256 /*shares*/ - ) external pure {} + function increaseDelegatedShares( + address staker, + IStrategy strategy, + uint256 existingShares, + uint256 addedShares + ) external {} + + function decreaseDelegatedShares(address staker, IStrategy strategy, uint256 shares) external {} function operatorDetails(address operator) external pure returns (OperatorDetails memory) { OperatorDetails memory returnValue = OperatorDetails({ @@ -85,16 +100,13 @@ contract DelegationManagerMock is IDelegationManager, Test { function strategyWithdrawalDelayBlocks(IStrategy /*strategy*/) external pure returns (uint256) { return 0; } - - function getOperatorShares( - address operator, - IStrategy[] memory strategies - ) external view returns (uint256[] memory) {} function getWithdrawalDelay(IStrategy[] calldata /*strategies*/) public pure returns (uint256) { return 0; } + function operatorScaledShares(address operator, IStrategy strategy) external view returns (uint256) {} + function isDelegated(address staker) external view returns (bool) { return (delegatedTo[staker] != address(0)); } @@ -155,14 +167,12 @@ contract DelegationManagerMock is IDelegationManager, Test { function completeQueuedWithdrawal( Withdrawal calldata withdrawal, IERC20[] calldata tokens, - uint256 middlewareTimesIndex, bool receiveAsTokens ) external {} function completeQueuedWithdrawals( Withdrawal[] calldata withdrawals, IERC20[][] calldata tokens, - uint256[] calldata middlewareTimesIndexes, bool[] calldata receiveAsTokens ) external {} diff --git a/src/test/mocks/Dummy.sol b/src/test/mocks/Dummy.sol index 79160b45f..6990c4e26 100644 --- a/src/test/mocks/Dummy.sol +++ b/src/test/mocks/Dummy.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.12; +pragma solidity ^0.8.27; contract EmptyContract { function foo() public pure returns (uint256) { diff --git a/src/test/mocks/ERC20Mock.sol b/src/test/mocks/ERC20Mock.sol index 5e02b68e8..ca0e4f677 100644 --- a/src/test/mocks/ERC20Mock.sol +++ b/src/test/mocks/ERC20Mock.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (token/ERC20/ERC20.sol) -pragma solidity ^0.8.12; +pragma solidity ^0.8.27; import "@openzeppelin/contracts/interfaces/IERC20.sol"; import "@openzeppelin/contracts/utils/Context.sol"; diff --git a/src/test/mocks/ERC20_OneWeiFeeOnTransfer.sol b/src/test/mocks/ERC20_OneWeiFeeOnTransfer.sol index 173acf69b..7606b2a31 100644 --- a/src/test/mocks/ERC20_OneWeiFeeOnTransfer.sol +++ b/src/test/mocks/ERC20_OneWeiFeeOnTransfer.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.12; +pragma solidity ^0.8.27; // copy-pasted OZ code with _balances mapping made *internal* instead of private diff --git a/src/test/mocks/ERC20_SetTransferReverting_Mock.sol b/src/test/mocks/ERC20_SetTransferReverting_Mock.sol index dd12a7fd3..70230a464 100644 --- a/src/test/mocks/ERC20_SetTransferReverting_Mock.sol +++ b/src/test/mocks/ERC20_SetTransferReverting_Mock.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.12; +pragma solidity ^0.8.27; import "@openzeppelin/contracts/token/ERC20/presets/ERC20PresetFixedSupply.sol"; diff --git a/src/test/mocks/ETHDepositMock.sol b/src/test/mocks/ETHDepositMock.sol index 8b8841974..8ad2ee0d5 100644 --- a/src/test/mocks/ETHDepositMock.sol +++ b/src/test/mocks/ETHDepositMock.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.12; +pragma solidity ^0.8.27; import "../../contracts/interfaces/IETHPOSDeposit.sol"; diff --git a/src/test/mocks/EigenPodManagerMock.sol b/src/test/mocks/EigenPodManagerMock.sol index 127fcc49a..53f4701d3 100644 --- a/src/test/mocks/EigenPodManagerMock.sol +++ b/src/test/mocks/EigenPodManagerMock.sol @@ -17,6 +17,14 @@ contract EigenPodManagerMock is IEigenPodManager, Test, Pausable { _initializePauser(_pauserRegistry, 0); } + function removeShares(address staker, IStrategy strategy, uint256 shares) external {} + + function addShares(address staker, IERC20 token, IStrategy strategy, uint256 shares) external {} + + function withdrawSharesAsTokens(address recipient, IStrategy strategy, uint256 shares, IERC20 token) external {} + + function stakerStrategyShares(address user, IStrategy strategy) external view returns (uint256 shares) {} + function slasher() external view returns(ISlasher) {} function createPod() external returns(address) {} @@ -41,6 +49,10 @@ contract EigenPodManagerMock is IEigenPodManager, Test, Pausable { return false; } + function podOwnerScaledShares(address podOwner) external view returns (int256) { + return podShares[podOwner]; + } + function podOwnerShares(address podOwner) external view returns (int256) { return podShares[podOwner]; } @@ -49,9 +61,9 @@ contract EigenPodManagerMock is IEigenPodManager, Test, Pausable { podShares[podOwner] = shares; } - function addShares(address /*podOwner*/, uint256 shares) external pure returns (uint256) { + function addShares(address /*podOwner*/, uint256 shares) external pure returns (uint256, uint256) { // this is the "increase in delegateable tokens" - return (shares); + // return (shares); } function withdrawSharesAsTokens(address podOwner, address destination, uint256 shares) external {} diff --git a/src/test/mocks/EmptyContract.sol b/src/test/mocks/EmptyContract.sol index 79160b45f..6990c4e26 100644 --- a/src/test/mocks/EmptyContract.sol +++ b/src/test/mocks/EmptyContract.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.12; +pragma solidity ^0.8.27; contract EmptyContract { function foo() public pure returns (uint256) { diff --git a/src/test/mocks/MockDecimals.sol b/src/test/mocks/MockDecimals.sol index 6f5afc44c..e450fdd5b 100644 --- a/src/test/mocks/MockDecimals.sol +++ b/src/test/mocks/MockDecimals.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.12; +pragma solidity ^0.8.27; contract MockDecimals { function decimals() public pure returns (uint8) { diff --git a/src/test/mocks/OwnableMock.sol b/src/test/mocks/OwnableMock.sol index 11ba5c53f..48abf590a 100644 --- a/src/test/mocks/OwnableMock.sol +++ b/src/test/mocks/OwnableMock.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.12; +pragma solidity ^0.8.27; import "@openzeppelin/contracts/access/Ownable.sol"; diff --git a/src/test/mocks/SlasherMock.sol b/src/test/mocks/SlasherMock.sol index 6524fc466..07f686d47 100644 --- a/src/test/mocks/SlasherMock.sol +++ b/src/test/mocks/SlasherMock.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.12; +pragma solidity ^0.8.27; import "forge-std/Test.sol"; import "../../contracts/interfaces/ISlasher.sol"; diff --git a/src/test/mocks/StrategyManagerMock.sol b/src/test/mocks/StrategyManagerMock.sol index cefd175fa..e1bc18181 100644 --- a/src/test/mocks/StrategyManagerMock.sol +++ b/src/test/mocks/StrategyManagerMock.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.12; +pragma solidity ^0.8.27; import "@openzeppelin-upgrades/contracts/proxy/utils/Initializable.sol"; import "@openzeppelin-upgrades/contracts/access/OwnableUpgradeable.sol"; @@ -34,8 +34,6 @@ contract StrategyManagerMock is /// @notice Mapping: staker => cumulative number of queued withdrawals they have ever initiated. only increments (doesn't decrement) mapping(address => uint256) public cumulativeWithdrawalsQueued; - - mapping(IStrategy => bool) public thirdPartyTransfersForbidden; function setAddresses(IDelegationManager _delegation, IEigenPodManager _eigenPodManager, ISlasher _slasher) external { @@ -66,8 +64,9 @@ contract StrategyManagerMock is external returns (uint256 shares) {} - /// @notice Returns the current shares of `user` in `strategy` - function stakerStrategyShares(address user, IStrategy strategy) external view returns (uint256 shares) {} + function getStakerStrategyList( + address staker + ) external view returns (IStrategy[] memory) {} /** * @notice mocks the return value of getDeposits @@ -81,11 +80,6 @@ contract StrategyManagerMock is sharesToReturn[staker] = _sharesToReturn; } - function setThirdPartyTransfersForbidden(IStrategy strategy, bool value) external { - emit UpdatedThirdPartyTransfersForbidden(strategy, value); - thirdPartyTransfersForbidden[strategy] = value; - } - /** * @notice Get all details on the staker's deposits and corresponding shares * @return (staker's strategies, shares in these strategies) @@ -98,6 +92,13 @@ contract StrategyManagerMock is function stakerStrats(address staker) external view returns (IStrategy[] memory) {} uint256 public stakerStrategyListLengthReturnValue; + + /// @notice Returns the current shares of `user` in `strategy` + function stakerStrategyShares( + address user, + IStrategy strategy + ) external view returns (uint256 shares) {} + /// @notice Simple getter function that returns `stakerStrategyList[staker].length`. function stakerStrategyListLength(address /*staker*/) external view returns (uint256) { return stakerStrategyListLengthReturnValue; @@ -123,12 +124,10 @@ contract StrategyManagerMock is // function withdrawalDelayBlocks() external view returns (uint256) {} function addStrategiesToDepositWhitelist( - IStrategy[] calldata strategiesToWhitelist, - bool[] calldata thirdPartyTransfersForbiddenValues + IStrategy[] calldata strategiesToWhitelist ) external { for (uint256 i = 0; i < strategiesToWhitelist.length; ++i) { strategyIsWhitelistedForDeposit[strategiesToWhitelist[i]] = true; - thirdPartyTransfersForbidden[strategiesToWhitelist[i]] = thirdPartyTransfersForbiddenValues[i]; } } diff --git a/src/test/token/EigenTransferRestrictions.t.sol b/src/test/token/EigenTransferRestrictions.t.sol index 37b690212..c7da62af2 100644 --- a/src/test/token/EigenTransferRestrictions.t.sol +++ b/src/test/token/EigenTransferRestrictions.t.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.12; +pragma solidity ^0.8.27; import "forge-std/Test.sol"; diff --git a/src/test/token/EigenWrapping.t.sol b/src/test/token/EigenWrapping.t.sol index d2a8683aa..43ad35225 100644 --- a/src/test/token/EigenWrapping.t.sol +++ b/src/test/token/EigenWrapping.t.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.12; +pragma solidity ^0.8.27; import "forge-std/Test.sol"; diff --git a/src/test/token/bEIGEN.t.sol b/src/test/token/bEIGEN.t.sol index 5338c5702..cf89d527a 100644 --- a/src/test/token/bEIGEN.t.sol +++ b/src/test/token/bEIGEN.t.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.12; +pragma solidity ^0.8.27; import "forge-std/Test.sol"; diff --git a/src/test/unit/AVSDirectoryUnit.t.sol b/src/test/unit/AVSDirectoryUnit.t.sol index 6fd70891f..547348ac4 100644 --- a/src/test/unit/AVSDirectoryUnit.t.sol +++ b/src/test/unit/AVSDirectoryUnit.t.sol @@ -1,14 +1,17 @@ // SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.12; +pragma solidity ^0.8.27; import "@openzeppelin/contracts/mocks/ERC1271WalletMock.sol"; import "src/contracts/core/DelegationManager.sol"; +import "src/contracts/core/AllocationManager.sol"; import "src/contracts/core/AVSDirectory.sol"; import "src/test/events/IAVSDirectoryEvents.sol"; import "src/test/utils/EigenLayerUnitTestSetup.sol"; +contract EmptyContract {} + /** * @notice Unit testing of the AVSDirectory contract. An AVSs' service manager contract will * call this to register an operator with the AVS. @@ -16,6 +19,10 @@ import "src/test/utils/EigenLayerUnitTestSetup.sol"; * Contracts not mocked: DelegationManager */ contract AVSDirectoryUnitTests is EigenLayerUnitTestSetup, IAVSDirectoryEvents { + uint256 internal constant MAX_PRIVATE_KEY = 0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140; + + EmptyContract emptyContract; + // Contract under test AVSDirectory avsDirectory; AVSDirectory avsDirectoryImplementation; @@ -23,6 +30,8 @@ contract AVSDirectoryUnitTests is EigenLayerUnitTestSetup, IAVSDirectoryEvents { // Contract dependencies DelegationManager delegationManager; DelegationManager delegationManagerImplementation; + AllocationManager allocationManager; + AllocationManager allocationManagerImplementation; // Delegation signer uint256 delegationSignerPrivateKey = uint256(0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80); @@ -34,12 +43,19 @@ contract AVSDirectoryUnitTests is EigenLayerUnitTestSetup, IAVSDirectoryEvents { // reused in various tests. in storage to help handle stack-too-deep errors address defaultAVS = address(this); + // deallocation delay in AllocationManager + uint32 DEALLOCATION_DELAY = 17.5 days; + uint32 ALLOCATION_DELAY_CONFIGURATION_DELAY = 21 days; + // withdrawal delay in DelegationManager + uint32 MIN_WITHDRAWAL_DELAY = 17.5 days; uint256 minWithdrawalDelayBlocks = 216_000; IStrategy[] public initializeStrategiesToSetDelayBlocks; uint256[] public initializeWithdrawalDelayBlocks; // Index for flag that pauses registering/deregistering for AVSs uint8 internal constant PAUSED_OPERATOR_REGISTER_DEREGISTER_TO_AVS = 0; + // Index for flag that pauses operator register/deregister to operator sets when set. + uint8 internal constant PAUSER_OPERATOR_REGISTER_DEREGISTER_TO_OPERATOR_SETS = 1; function setUp() public virtual override { // Setup @@ -48,7 +64,32 @@ contract AVSDirectoryUnitTests is EigenLayerUnitTestSetup, IAVSDirectoryEvents { // Deploy DelegationManager implmentation and proxy initializeStrategiesToSetDelayBlocks = new IStrategy[](0); initializeWithdrawalDelayBlocks = new uint256[](0); - delegationManagerImplementation = new DelegationManager(strategyManagerMock, slasherMock, eigenPodManagerMock); + + emptyContract = new EmptyContract(); + + avsDirectory = AVSDirectory( + address(new TransparentUpgradeableProxy(address(emptyContract), address(eigenLayerProxyAdmin), "")) + ); + delegationManager = DelegationManager( + address(new TransparentUpgradeableProxy(address(emptyContract), address(eigenLayerProxyAdmin), "")) + ); + allocationManager = AllocationManager( + address(new TransparentUpgradeableProxy(address(emptyContract), address(eigenLayerProxyAdmin), "")) + ); + + allocationManagerImplementation = new AllocationManager(delegationManager, avsDirectory, DEALLOCATION_DELAY, ALLOCATION_DELAY_CONFIGURATION_DELAY); + + delegationManagerImplementation = new DelegationManager( + strategyManagerMock, + slasherMock, + eigenPodManagerMock, + avsDirectory, + allocationManager, + MIN_WITHDRAWAL_DELAY + ); + + avsDirectoryImplementation = new AVSDirectory(delegationManager); + delegationManager = DelegationManager( address( new TransparentUpgradeableProxy( @@ -67,8 +108,6 @@ contract AVSDirectoryUnitTests is EigenLayerUnitTestSetup, IAVSDirectoryEvents { ) ); - // Deploy AVSDirectory implmentation and proxy - avsDirectoryImplementation = new AVSDirectory(delegationManager); avsDirectory = AVSDirectory( address( new TransparentUpgradeableProxy( @@ -93,11 +132,11 @@ contract AVSDirectoryUnitTests is EigenLayerUnitTestSetup, IAVSDirectoryEvents { */ /** - * @notice internal function for calculating a signature from the operator corresponding to `_operatorPrivateKey`, delegating them to + * @notice internal function for calculating a signature from the operator corresponding to `operatorPk`, delegating them to * the `operator`, and expiring at `expiry`. */ - function _getOperatorSignature( - uint256 _operatorPrivateKey, + function _getOperatorAVSRegistrationSignature( + uint256 operatorPk, address operator, address avs, bytes32 salt, @@ -107,7 +146,7 @@ contract AVSDirectoryUnitTests is EigenLayerUnitTestSetup, IAVSDirectoryEvents { operatorSignature.salt = salt; { bytes32 digestHash = avsDirectory.calculateOperatorAVSRegistrationDigestHash(operator, avs, salt, expiry); - (uint8 v, bytes32 r, bytes32 s) = cheats.sign(_operatorPrivateKey, digestHash); + (uint8 v, bytes32 r, bytes32 s) = cheats.sign(operatorPk, digestHash); operatorSignature.signature = abi.encodePacked(r, s, v); } return operatorSignature; @@ -156,7 +195,7 @@ contract AVSDirectoryUnitTests is EigenLayerUnitTestSetup, IAVSDirectoryEvents { ) internal filterFuzzedAddressInputs(operator) { _filterOperatorDetails(operator, operatorDetails); cheats.prank(operator); - delegationManager.registerAsOperator(operatorDetails, metadataURI); + delegationManager.registerAsOperator(operatorDetails, 0, metadataURI); } function _filterOperatorDetails( @@ -165,24 +204,1088 @@ contract AVSDirectoryUnitTests is EigenLayerUnitTestSetup, IAVSDirectoryEvents { ) internal view { // filter out zero address since people can't delegate to the zero address and operators are delegated to themselves cheats.assume(operator != address(0)); - // filter out disallowed stakerOptOutWindowBlocks values - cheats.assume(operatorDetails.stakerOptOutWindowBlocks <= delegationManager.MAX_STAKER_OPT_OUT_WINDOW_BLOCKS()); + } + + function _registerOperatorToOperatorSet( + uint256 operatorPk, + uint32 operatorSetId, + bytes32 salt, + uint256 expiry + ) internal virtual { + uint32[] memory oids = new uint32[](1); + oids[0] = operatorSetId; + + _registerOperatorToOperatorSets(operatorPk, oids, salt, expiry); + } + + function _registerOperatorToOperatorSets( + uint256 operatorPk, + uint32[] memory operatorSetIds, + bytes32 salt, + uint256 expiry + ) internal virtual { + expiry = bound(expiry, 1, type(uint256).max); + cheats.warp(0); + + address operator = cheats.addr(operatorPk); + (uint8 v, bytes32 r, bytes32 s) = cheats.sign( + operatorPk, + avsDirectory.calculateOperatorSetRegistrationDigestHash(address(this), operatorSetIds, salt, expiry) + ); + + // Set AVS as operator set avs + avsDirectory.becomeOperatorSetAVS(); + + _registerOperatorWithBaseDetails(operator); + + avsDirectory.registerOperatorToOperatorSets( + operator, + operatorSetIds, + ISignatureUtils.SignatureWithSaltAndExpiry(abi.encodePacked(r, s, v), salt, expiry) + ); + } + + function _createOperatorSet(uint32 operatorSetId) internal { + uint32[] memory oids = new uint32[](1); + oids[0] = operatorSetId; + avsDirectory.createOperatorSets(oids); + } + + function _createOperatorSets(uint32[] memory operatorSetIds) internal { + avsDirectory.createOperatorSets(operatorSetIds); + } +} + +contract AVSDirectoryUnitTests_initialize is AVSDirectoryUnitTests { + function testFuzz_Correctness( + address delegationManager, + address owner, + address pauserRegistry, + uint256 initialPausedStatus + ) public virtual { + AVSDirectory dir = new AVSDirectory(IDelegationManager(delegationManager)); + + assertEq(address(dir.delegation()), delegationManager); + + cheats.expectRevert("Initializable: contract is already initialized"); + dir.initialize(owner, IPauserRegistry(pauserRegistry), initialPausedStatus); + } +} + +contract AVSDirectoryUnitTests_domainSeparator is AVSDirectoryUnitTests { + function test_domainSeparator() public virtual { + // This is just to get coverage up. + avsDirectory.domainSeparator(); + cheats.chainId(0xC0FFEE); + avsDirectory.domainSeparator(); + } +} + +contract AVSDirectoryUnitTests_registerOperatorToOperatorSet is AVSDirectoryUnitTests { + function testFuzz_revert_SignatureIsExpired( + address operator, + uint32 operatorSetId, + bytes32 salt, + uint256 expiry + ) public virtual { + expiry = bound(expiry, 0, type(uint256).max - 1); + cheats.warp(type(uint256).max); + + _createOperatorSet(operatorSetId); + + _registerOperatorWithBaseDetails(operator); + + uint32[] memory oids = new uint32[](1); + oids[0] = operatorSetId; + + cheats.expectRevert("AVSDirectory.registerOperatorToOperatorSets: operator signature expired"); + avsDirectory.registerOperatorToOperatorSets( + operator, oids, ISignatureUtils.SignatureWithSaltAndExpiry(new bytes(0), salt, expiry) + ); + } + + function testFuzz_revert_notOperatorSetAVS( + uint256 operatorPk, + uint32 operatorSetId, + bytes32 salt, + uint256 expiry + ) public virtual { + operatorPk = bound(operatorPk, 1, MAX_PRIVATE_KEY); + expiry = bound(expiry, 1, type(uint256).max); + + cheats.warp(0); + + _createOperatorSet(operatorSetId); + + uint32[] memory oids = new uint32[](1); + oids[0] = operatorSetId; + + address operator = cheats.addr(operatorPk); + (uint8 v, bytes32 r, bytes32 s) = cheats.sign( + operatorPk, avsDirectory.calculateOperatorSetRegistrationDigestHash(address(this), oids, salt, expiry) + ); + + _registerOperatorWithBaseDetails(operator); + + cheats.expectRevert("AVSDirectory.registerOperatorToOperatorSets: AVS is not an operator set AVS"); + avsDirectory.registerOperatorToOperatorSets( + operator, oids, ISignatureUtils.SignatureWithSaltAndExpiry(abi.encodePacked(r, s, v), salt, expiry) + ); + } + + function testFuzz_revert_OperatorRegistered( + uint256 operatorPk, + uint32 operatorSetId, + bytes32 salt, + uint256 expiry + ) public virtual { + avsDirectory.becomeOperatorSetAVS(); + operatorPk = bound(operatorPk, 1, MAX_PRIVATE_KEY); + expiry = bound(expiry, 1, type(uint256).max); + + cheats.warp(0); + + _createOperatorSet(operatorSetId); + + uint32[] memory oids = new uint32[](1); + oids[0] = operatorSetId; + + address operator = cheats.addr(operatorPk); + (uint8 v, bytes32 r, bytes32 s) = cheats.sign( + operatorPk, avsDirectory.calculateOperatorSetRegistrationDigestHash(address(this), oids, salt, expiry) + ); + + _registerOperatorWithBaseDetails(operator); + + avsDirectory.registerOperatorToOperatorSets( + operator, oids, ISignatureUtils.SignatureWithSaltAndExpiry(abi.encodePacked(r, s, v), salt, expiry) + ); + + (v, r, s) = cheats.sign( + operatorPk, + avsDirectory.calculateOperatorSetRegistrationDigestHash(address(this), oids, keccak256(""), expiry) + ); + + cheats.expectRevert("AVSDirectory._registerOperatorToOperatorSets: operator already registered to operator set"); + avsDirectory.registerOperatorToOperatorSets( + operator, oids, ISignatureUtils.SignatureWithSaltAndExpiry(abi.encodePacked(r, s, v), keccak256(""), expiry) + ); + } + + function testFuzz_revert_OperatorNotRegistered( + address operator, + uint32 operatorSetId, + bytes32 salt, + uint256 expiry + ) public virtual { + avsDirectory.becomeOperatorSetAVS(); + cheats.assume(operator != address(0)); + expiry = bound(expiry, 1, type(uint256).max); + cheats.warp(0); + + _createOperatorSet(operatorSetId); + + uint32[] memory oids = new uint32[](1); + oids[0] = operatorSetId; + + cheats.expectRevert("AVSDirectory.registerOperatorToOperatorSets: operator not registered to EigenLayer yet"); + avsDirectory.registerOperatorToOperatorSets( + operator, oids, ISignatureUtils.SignatureWithSaltAndExpiry(new bytes(0), salt, expiry) + ); + } + + function testFuzz_revert_SaltSpent( + uint256 operatorPk, + uint32 operatorSetId, + bytes32 salt, + uint256 expiry + ) public virtual { + avsDirectory.becomeOperatorSetAVS(); + operatorSetId = uint32(bound(operatorSetId, 1, type(uint32).max)); + operatorPk = bound(operatorPk, 1, MAX_PRIVATE_KEY); + expiry = bound(expiry, 1, type(uint256).max); + + cheats.warp(0); + + _createOperatorSet(operatorSetId); + + uint32[] memory oids = new uint32[](1); + oids[0] = operatorSetId; + + address operator = cheats.addr(operatorPk); + (uint8 v, bytes32 r, bytes32 s) = cheats.sign( + operatorPk, avsDirectory.calculateOperatorSetRegistrationDigestHash(address(this), oids, salt, expiry) + ); + + _registerOperatorWithBaseDetails(operator); + + avsDirectory.registerOperatorToOperatorSets( + operator, oids, ISignatureUtils.SignatureWithSaltAndExpiry(abi.encodePacked(r, s, v), salt, expiry) + ); + + cheats.expectRevert("AVSDirectory.registerOperatorToOperatorSets: salt already spent"); + avsDirectory.registerOperatorToOperatorSets( + operator, new uint32[](0), ISignatureUtils.SignatureWithSaltAndExpiry(new bytes(0), salt, expiry) + ); + } + + function testFuzz_revert_WrongAVS( + address badAvs, + uint256 operatorPk, + uint32 operatorSetId, + bytes32 salt, + uint256 expiry + ) public virtual { + cheats.assume(badAvs != address(this)); + + operatorSetId = uint32(bound(operatorSetId, 1, type(uint32).max)); + operatorPk = bound(operatorPk, 1, MAX_PRIVATE_KEY); + expiry = bound(expiry, 1, type(uint256).max); + + cheats.warp(0); + + _createOperatorSet(operatorSetId); + + uint32[] memory oids = new uint32[](1); + oids[0] = operatorSetId; + + address operator = cheats.addr(operatorPk); + + (uint8 v, bytes32 r, bytes32 s) = cheats.sign( + operatorPk, avsDirectory.calculateOperatorSetRegistrationDigestHash(address(this), oids, salt, expiry) + ); + + _registerOperatorWithBaseDetails(operator); + + cheats.startPrank(badAvs); + avsDirectory.becomeOperatorSetAVS(); + cheats.expectRevert("EIP1271SignatureUtils.checkSignature_EIP1271: signature not from signer"); + avsDirectory.registerOperatorToOperatorSets( + operator, oids, ISignatureUtils.SignatureWithSaltAndExpiry(abi.encodePacked(r, s, v), salt, expiry) + ); + cheats.stopPrank(); + } + + function testFuzz_revert_invalidOperatorSet( + uint256 operatorPk, + uint32 operatorSetId, + bytes32 salt, + uint256 expiry + ) public virtual { + avsDirectory.becomeOperatorSetAVS(); + operatorPk = bound(operatorPk, 1, MAX_PRIVATE_KEY); + expiry = bound(expiry, 1, type(uint256).max); + + cheats.warp(0); + + uint32[] memory oids = new uint32[](1); + oids[0] = operatorSetId; + + address operator = cheats.addr(operatorPk); + (uint8 v, bytes32 r, bytes32 s) = cheats.sign( + operatorPk, avsDirectory.calculateOperatorSetRegistrationDigestHash(address(this), oids, salt, expiry) + ); + + _registerOperatorWithBaseDetails(operator); + + cheats.expectRevert("AVSDirectory._registerOperatorToOperatorSets: invalid operator set"); + avsDirectory.registerOperatorToOperatorSets( + operator, oids, ISignatureUtils.SignatureWithSaltAndExpiry(abi.encodePacked(r, s, v), salt, expiry) + ); + } + + function testFuzz_MultipleCorrectness( + uint256 operatorPk, + uint256 totalSets, + bytes32 salt, + uint256 expiry + ) public virtual { + avsDirectory.becomeOperatorSetAVS(); + operatorPk = bound(operatorPk, 1, MAX_PRIVATE_KEY); + totalSets = bound(totalSets, 1, 64); + expiry = bound(expiry, 1, type(uint256).max); + + cheats.warp(0); + + uint32[] memory oids = new uint32[](totalSets); + for (uint256 i; i < oids.length; ++i) { + oids[i] = uint32(uint256(keccak256(abi.encodePacked(i))) % type(uint32).max); + _createOperatorSet(oids[i]); + } + + address operator = cheats.addr(operatorPk); + (uint8 v, bytes32 r, bytes32 s) = cheats.sign( + operatorPk, avsDirectory.calculateOperatorSetRegistrationDigestHash(address(this), oids, salt, expiry) + ); + + _registerOperatorWithBaseDetails(operator); + + for (uint256 i; i < oids.length; ++i) { + cheats.expectEmit(true, false, false, false, address(avsDirectory)); + emit OperatorAddedToOperatorSet(operator, OperatorSet(address(this), oids[i])); + } + + avsDirectory.registerOperatorToOperatorSets( + operator, oids, ISignatureUtils.SignatureWithSaltAndExpiry(abi.encodePacked(r, s, v), salt, expiry) + ); + + OperatorSet[] memory operatorSets = + avsDirectory.getOperatorSetsOfOperator(operator, 0, type(uint256).max); + + for (uint256 i; i < oids.length; ++i) { + assertTrue(avsDirectory.isMember(operator, OperatorSet(address(this), oids[i]))); + assertEq(avsDirectory.getNumOperatorsInOperatorSet(OperatorSet(address(this), oids[i])), 1); + assertEq(operatorSets[i].avs, address(this)); + assertEq(operatorSets[i].operatorSetId, oids[i]); + } + + for (uint256 i; i < oids.length; ++i) { + address[] memory operators = avsDirectory.getOperatorsInOperatorSet(OperatorSet(address(this), oids[i]), 0, type(uint256).max); + assertEq(operators.length, 1); + assertEq(operators[0], operator); + } + + assertEq(operatorSets.length, totalSets); + assertEq(avsDirectory.inTotalOperatorSets(operator), totalSets); + assertTrue(avsDirectory.operatorSaltIsSpent(operator, salt)); + } + + function testFuzz_Correctness( + uint256 operatorPk, + uint32 operatorSetId, + bytes32 salt, + uint256 expiry + ) public virtual { + avsDirectory.becomeOperatorSetAVS(); + operatorPk = bound(operatorPk, 1, MAX_PRIVATE_KEY); + expiry = bound(expiry, 1, type(uint256).max); + + cheats.warp(0); + + _createOperatorSet(operatorSetId); + + uint32[] memory oids = new uint32[](1); + oids[0] = operatorSetId; + + address operator = cheats.addr(operatorPk); + (uint8 v, bytes32 r, bytes32 s) = cheats.sign( + operatorPk, avsDirectory.calculateOperatorSetRegistrationDigestHash(address(this), oids, salt, expiry) + ); + + _registerOperatorWithBaseDetails(operator); + + cheats.expectEmit(true, false, false, false, address(avsDirectory)); + emit OperatorAddedToOperatorSet(operator, OperatorSet(address(this), operatorSetId)); + avsDirectory.registerOperatorToOperatorSets( + operator, oids, ISignatureUtils.SignatureWithSaltAndExpiry(abi.encodePacked(r, s, v), salt, expiry) + ); + + assertTrue(avsDirectory.isMember(operator, OperatorSet(address(this), operatorSetId))); + + OperatorSet memory operatorSet = avsDirectory.operatorSetsMemberOfAtIndex(operator, 0); + + assertEq(operatorSet.avs, address(this)); + assertEq(operatorSet.operatorSetId, oids[0]); + + address operatorInSet = avsDirectory.operatorSetMemberAtIndex(OperatorSet(address(this), operatorSetId), 0); + assertEq(operator, operatorInSet); + + assertEq(avsDirectory.inTotalOperatorSets(operator), 1); + assertTrue(avsDirectory.operatorSaltIsSpent(operator, salt)); + assertEq(avsDirectory.getNumOperatorsInOperatorSet(OperatorSet(address(this), operatorSetId)), 1); + } + + function testFuzz_Correctness_MultipleSets( + uint256 operatorPk, + uint256 totalSets, + bytes32 salt, + uint256 expiry + ) public virtual { + avsDirectory.becomeOperatorSetAVS(); + operatorPk = bound(operatorPk, 1, MAX_PRIVATE_KEY); + totalSets = bound(totalSets, 1, 64); + expiry = bound(expiry, 1, type(uint256).max); + + cheats.warp(0); + + uint32[] memory oids = new uint32[](totalSets); + + for (uint32 i = 1; i < totalSets + 1; ++i) { + _createOperatorSet(i); + oids[i - 1] = i; + } + + address operator = cheats.addr(operatorPk); + (uint8 v, bytes32 r, bytes32 s) = cheats.sign( + operatorPk, avsDirectory.calculateOperatorSetRegistrationDigestHash(address(this), oids, salt, expiry) + ); + + _registerOperatorWithBaseDetails(operator); + + for (uint32 i = 1; i < totalSets + 1; ++i) { + cheats.expectEmit(true, false, false, false, address(avsDirectory)); + emit OperatorAddedToOperatorSet(operator, OperatorSet(address(this), i)); + } + + avsDirectory.registerOperatorToOperatorSets( + operator, oids, ISignatureUtils.SignatureWithSaltAndExpiry(abi.encodePacked(r, s, v), salt, expiry) + ); + + OperatorSet[] memory operatorSets = + avsDirectory.getOperatorSetsOfOperator(operator, 0, type(uint256).max); + + for (uint32 i = 1; i < totalSets + 1; ++i) { + assertTrue(avsDirectory.isMember(operator, OperatorSet(address(this), i))); + assertEq(avsDirectory.getNumOperatorsInOperatorSet(OperatorSet(address(this), i)), 1); + + assertEq(operatorSets[i - 1].avs, address(this)); + assertEq(operatorSets[i - 1].operatorSetId, i); + } + + for(uint32 i = 1; i < totalSets + 1; ++i) { + address[] memory operators = avsDirectory.getOperatorsInOperatorSet(OperatorSet(address(this), i), 0, type(uint256).max); + assertEq(operators.length, 1); + assertEq(operators[0], operator); + } + + assertEq(avsDirectory.inTotalOperatorSets(operator), totalSets); + assertTrue(avsDirectory.operatorSaltIsSpent(operator, salt)); + + assertEq(operatorSets.length, totalSets); } } -contract AVSDirectoryUnitTests_operatorAVSRegisterationStatus is AVSDirectoryUnitTests { +contract AVSDirectoryUnitTests_forceDeregisterFromOperatorSets is AVSDirectoryUnitTests { + function testFuzz_revert_OperatorNotInOperatorSet(uint256 operatorPk, uint32 operatorSetId) public virtual { + operatorPk = bound(operatorPk, 1, MAX_PRIVATE_KEY); + + address operator = cheats.addr(operatorPk); + uint32[] memory oids = new uint32[](1); + oids[0] = operatorSetId; + + _createOperatorSet(operatorSetId); + + ISignatureUtils.SignatureWithSaltAndExpiry memory emptySig; + + cheats.prank(operator); + cheats.expectRevert("AVSDirectory._deregisterOperatorFromOperatorSet: operator not registered for operator set"); + + avsDirectory.forceDeregisterFromOperatorSets(operator, address(this), oids, emptySig); + } + + function testFuzz_revert_operatorNotCaller(uint256 operatorPk, uint32 operatorSetId) public { + operatorPk = bound(operatorPk, 1, MAX_PRIVATE_KEY); + + address operator = cheats.addr(operatorPk); + uint32[] memory oids = new uint32[](1); + oids[0] = operatorSetId; + + _createOperatorSet(operatorSetId); + + ISignatureUtils.SignatureWithSaltAndExpiry memory emptySig; + + cheats.expectRevert("AVSDirectory.forceDeregisterFromOperatorSets: caller must be operator"); + avsDirectory.forceDeregisterFromOperatorSets(operator, address(this), oids, emptySig); + } + + function testFuzz_forceDeregisterFromOperatorSets( + uint256 operatorPk, + uint32 operatorSetId, + uint8 operatorSetsToAdd, + bytes32 salt + ) public { + operatorPk = bound(operatorPk, 1, MAX_PRIVATE_KEY); + operatorSetsToAdd = uint8(bound(operatorSetsToAdd, 1, 64)); + address operator = cheats.addr(operatorPk); + + // Create operator sets + operatorSetId = uint32(bound(operatorSetId, 1, type(uint32).max - uint32(operatorSetsToAdd))); + uint32[] memory oids = new uint32[](operatorSetsToAdd); + for (uint32 i = 0; i < operatorSetsToAdd; i++) { + oids[i] = operatorSetId + i; + _createOperatorSet(oids[i]); + } + + // Register operator to operator sets + _registerOperatorToOperatorSets(operatorPk, oids, salt, type(uint256).max); + + assertEq(avsDirectory.getNumOperatorsInOperatorSet(OperatorSet(address(this), operatorSetId)), 1); + + // Deregister operator from operator sets + ISignatureUtils.SignatureWithSaltAndExpiry memory emptySig; + cheats.prank(operator); + for (uint256 i = 0; i < oids.length; i++) { + cheats.expectEmit(true, true, true, true, address(avsDirectory)); + emit OperatorRemovedFromOperatorSet(operator, OperatorSet(address(this), oids[i])); + } + avsDirectory.forceDeregisterFromOperatorSets(operator, address(this), oids, emptySig); + + for (uint32 i = 0; i < operatorSetsToAdd; i++) { + assertFalse( + avsDirectory.isMember(operator, OperatorSet(address(this), oids[i])), + "operator still in operator set" + ); + + address[] memory operators = avsDirectory.getOperatorsInOperatorSet(OperatorSet(address(this), oids[i]), 0, type(uint256).max); + assertEq(operators.length, 0); + } + + OperatorSet[] memory operatorSets = + avsDirectory.getOperatorSetsOfOperator(operator, 0, type(uint256).max); + + assertEq(operatorSets.length, 0); + assertEq(avsDirectory.inTotalOperatorSets(operator), 0); + assertEq(avsDirectory.getNumOperatorsInOperatorSet(OperatorSet(address(this), operatorSetId)), 0); + } + + function testFuzz_revert_sigExpired(uint256 operatorPk, uint32 operatorSetId, bytes32 salt) public { + operatorPk = bound(operatorPk, 1, MAX_PRIVATE_KEY); + + address operator = cheats.addr(operatorPk); + uint32[] memory oids = new uint32[](1); + oids[0] = operatorSetId; + + _createOperatorSet(operatorSetId); + + ISignatureUtils.SignatureWithSaltAndExpiry memory operatorSig = + _createForceDeregSignature(operatorPk, address(this), oids, 0, salt); + + cheats.warp(type(uint256).max); + cheats.expectRevert("AVSDirectory.forceDeregisterFromOperatorSets: operator signature expired"); + avsDirectory.forceDeregisterFromOperatorSets(operator, address(this), oids, operatorSig); + } + + function testFuzz_revert_saltAlreadySpent(uint256 operatorPk, uint32 operatorSetId, bytes32 salt) public { + operatorPk = bound(operatorPk, 1, MAX_PRIVATE_KEY); + + address operator = cheats.addr(operatorPk); + uint32[] memory oids = new uint32[](1); + oids[0] = operatorSetId; + + // Register operator to operator sets + _createOperatorSet(operatorSetId); + _registerOperatorToOperatorSets(operatorPk, oids, salt, type(uint256).max); + + ISignatureUtils.SignatureWithSaltAndExpiry memory operatorSig = + _createForceDeregSignature(operatorPk, address(this), oids, type(uint256).max, salt); + + cheats.expectRevert("AVSDirectory.forceDeregisterFromOperatorSets: salt already spent"); + avsDirectory.forceDeregisterFromOperatorSets(operator, address(this), oids, operatorSig); + } + + function testFuzz_forceDeregisterFromOperatorSets_onBehalf( + uint256 operatorPk, + uint32 operatorSetId, + uint8 operatorSetsToAdd, + bytes32 salt1, + bytes32 salt2 + ) public { + cheats.assume(salt1 != salt2); + + operatorPk = bound(operatorPk, 1, MAX_PRIVATE_KEY); + operatorSetsToAdd = uint8(bound(operatorSetsToAdd, 1, 64)); + address operator = cheats.addr(operatorPk); + + // Create operator sets + operatorSetId = uint32(bound(operatorSetId, 1, type(uint32).max - uint32(operatorSetsToAdd))); + uint32[] memory oids = new uint32[](operatorSetsToAdd); + for (uint32 i = 0; i < oids.length; i++) { + oids[i] = operatorSetId + i; + _createOperatorSet(oids[i]); + } + + // Register operator to operator sets + _registerOperatorToOperatorSets(operatorPk, oids, salt1, type(uint256).max); + + // Deregister operator from operator sets + ISignatureUtils.SignatureWithSaltAndExpiry memory operatorSig = + _createForceDeregSignature(operatorPk, address(this), oids, type(uint256).max, salt2); + + for (uint256 i = 0; i < oids.length; i++) { + cheats.expectEmit(true, true, true, true, address(avsDirectory)); + emit OperatorRemovedFromOperatorSet(operator, OperatorSet(address(this), oids[i])); + } + + avsDirectory.forceDeregisterFromOperatorSets(operator, address(this), oids, operatorSig); + + for (uint32 i = 0; i < operatorSetsToAdd; i++) { + assertFalse(avsDirectory.isMember(operator, OperatorSet(address(this), oids[i]))); + } + } + + function _createForceDeregSignature( + uint256 operatorPk, + address avs, + uint32[] memory oids, + uint256 expiry, + bytes32 salt + ) internal view returns (ISignatureUtils.SignatureWithSaltAndExpiry memory operatorSignature) { + operatorSignature.expiry = expiry; + operatorSignature.salt = salt; + { + bytes32 digestHash = avsDirectory.calculateOperatorSetForceDeregistrationTypehash(avs, oids, salt, expiry); + (uint8 v, bytes32 r, bytes32 s) = cheats.sign(operatorPk, digestHash); + operatorSignature.signature = abi.encodePacked(r, s, v); + } + return operatorSignature; + } +} + +contract AVSDirectoryUnitTests_deregisterOperatorFromOperatorSets is AVSDirectoryUnitTests { + function testFuzz_revert_OperatorNotInOperatorSet(uint256 operatorPk, uint32 operatorSetId) public virtual { + operatorPk = bound(operatorPk, 1, MAX_PRIVATE_KEY); + + _createOperatorSet(operatorSetId); + + address operator = cheats.addr(operatorPk); + uint32[] memory oids = new uint32[](1); + oids[0] = operatorSetId; + + cheats.expectRevert("AVSDirectory._deregisterOperatorFromOperatorSet: operator not registered for operator set"); + avsDirectory.deregisterOperatorFromOperatorSets(operator, oids); + } + + function testFuzz_Correctness( + uint256 operatorPk, + uint32 operatorSetId, + bytes32 salt, + uint256 expiry + ) public virtual { + operatorPk = bound(operatorPk, 1, MAX_PRIVATE_KEY); + + _createOperatorSet(operatorSetId); + + _registerOperatorToOperatorSet(operatorPk, operatorSetId, salt, expiry); + + address operator = cheats.addr(operatorPk); + uint32[] memory oids = new uint32[](1); + oids[0] = operatorSetId; + + // sanity + assertEq(avsDirectory.inTotalOperatorSets(operator), 1); + assertEq(avsDirectory.getNumOperatorsInOperatorSet(OperatorSet(address(this), operatorSetId)), 1); + + cheats.expectEmit(true, false, false, false, address(avsDirectory)); + emit OperatorRemovedFromOperatorSet(operator, OperatorSet(address(this), operatorSetId)); + + avsDirectory.deregisterOperatorFromOperatorSets(operator, oids); + + // out of bounds array access + vm.expectRevert(); + avsDirectory.operatorSetsMemberOfAtIndex(operator, 0); + + assertEq(avsDirectory.inTotalOperatorSets(operator), 0); + assertEq(avsDirectory.getNumOperatorsInOperatorSet(OperatorSet(address(this), operatorSetId)), 0); + assertEq(avsDirectory.isMember(operator, OperatorSet(address(this), operatorSetId)), false); + } + + function testFuzz_Correctness_MultipleSets( + uint256 operatorPk, + uint256 totalSets, + bytes32 salt, + uint256 expiry + ) public virtual { + operatorPk = bound(operatorPk, 1, MAX_PRIVATE_KEY); + totalSets = bound(totalSets, 1, 64); + + uint32[] memory oids = new uint32[](totalSets); + + for (uint32 i = 1; i < totalSets + 1; ++i) { + _createOperatorSet(i); + oids[i - 1] = i; + } + + _registerOperatorToOperatorSets(operatorPk, oids, salt, expiry); + + for (uint32 i = 1; i < totalSets + 1; ++i) { + assertEq(avsDirectory.getNumOperatorsInOperatorSet(OperatorSet(address(this), i)), 1); + } + + address operator = cheats.addr(operatorPk); + + // sanity + assertEq(avsDirectory.inTotalOperatorSets(operator), totalSets); + + for (uint32 i = 1; i < totalSets + 1; ++i) { + cheats.expectEmit(true, false, false, false, address(avsDirectory)); + emit OperatorRemovedFromOperatorSet(operator, OperatorSet(address(this), i)); + } + + avsDirectory.deregisterOperatorFromOperatorSets(operator, oids); + + for (uint32 i = 1; i < totalSets + 1; ++i) { + assertEq(avsDirectory.getNumOperatorsInOperatorSet(OperatorSet(address(this), i)), 0); + assertEq(avsDirectory.isMember(operator, OperatorSet(address(this), i)), false); + } + + OperatorSet[] memory operatorSets = + avsDirectory.getOperatorSetsOfOperator(operator, 0, type(uint256).max); + + assertEq(operatorSets.length, 0); + assertEq(avsDirectory.inTotalOperatorSets(operator), 0); + } +} + +contract AVSDirectoryUnitTests_createOperatorSet is AVSDirectoryUnitTests { + function testFuzz_createOperatorSet(uint256 totalSets) public { + totalSets = bound(totalSets, 1, 64); + + uint32[] memory oids = new uint32[](totalSets); + + for (uint32 i; i < totalSets; ++i) { + oids[i] = i + 1; + cheats.expectEmit(true, true, true, true, address(avsDirectory)); + emit OperatorSetCreated(OperatorSet({avs: address(this), operatorSetId: i + 1})); + } + + avsDirectory.createOperatorSets(oids); + + for (uint32 i = 1; i < totalSets + 1; ++i) { + assertTrue(avsDirectory.isOperatorSet(address(this), i)); + } + } + + function test_revert_operatorSetExists() public { + _createOperatorSet(1); + cheats.expectRevert("AVSDirectory.createOperatorSet: operator set already exists"); + _createOperatorSet(1); + } +} + +contract AVSDirectoryUnitTests_becomeOperatorSetAVS is AVSDirectoryUnitTests { + function test_becomeOperatorSetAVS() public { + cheats.expectEmit(true, true, true, true, address(avsDirectory)); + emit AVSMigratedToOperatorSets(address(this)); + + avsDirectory.becomeOperatorSetAVS(); + + assertTrue(avsDirectory.isOperatorSetAVS(address(this))); + } + + function test_revert_alreadyOperatorSetAVS() public { + avsDirectory.becomeOperatorSetAVS(); + cheats.expectRevert("AVSDirectory.becomeOperatorSetAVS: already an operator set AVS"); + avsDirectory.becomeOperatorSetAVS(); + } +} + +contract AVSDirectoryUnitTests_migrateOperatorsToOperatorSets is AVSDirectoryUnitTests { + address[] operators = new address[](1); + uint32[][] operatorSetIds = new uint32[][](1); + + function test_revert_paused() public { + cheats.prank(pauser); + avsDirectory.pause(2 ** PAUSER_OPERATOR_REGISTER_DEREGISTER_TO_OPERATOR_SETS); + + operators = new address[](1); + operatorSetIds = new uint32[][](1); + + cheats.expectRevert("Pausable: index is paused"); + cheats.prank(defaultAVS); + avsDirectory.migrateOperatorsToOperatorSets(operators, operatorSetIds); + } + + function test_revert_notOperatorSetAVS() public { + cheats.expectRevert("AVSDirectory.migrateOperatorsToOperatorSets: AVS is not an operator set AVS"); + cheats.prank(defaultAVS); + avsDirectory.migrateOperatorsToOperatorSets(operators, operatorSetIds); + } + + function test_revert_operatorNotM2Registered() public { + address operator = cheats.addr(delegationSignerPrivateKey); + operators = new address[](1); + operators[0] = operator; + + avsDirectory.becomeOperatorSetAVS(); + cheats.expectRevert( + "AVSDirectory.migrateOperatorsToOperatorSets: operator already migrated or not a legacy registered operator" + ); + avsDirectory.migrateOperatorsToOperatorSets(operators, operatorSetIds); + } + + function test_revert_operatorAlreadyMigrated(bytes32 salt) public { + // Register Operator to M2 + address operator = cheats.addr(delegationSignerPrivateKey); + _registerOperatorLegacyM2(delegationSignerPrivateKey, salt); + + // Format calldata + operators = new address[](1); + operators[0] = operator; + operatorSetIds = new uint32[][](1); + operatorSetIds[0] = new uint32[](1); + operatorSetIds[0][0] = 1; + + // Setup Operator Sets + _createOperatorSet(1); + avsDirectory.becomeOperatorSetAVS(); + + // Migrate Operator + avsDirectory.migrateOperatorsToOperatorSets(operators, operatorSetIds); + + // Revert when trying to migrate operator again + cheats.expectRevert( + "AVSDirectory.migrateOperatorsToOperatorSets: operator already migrated or not a legacy registered operator" + ); + avsDirectory.migrateOperatorsToOperatorSets(operators, operatorSetIds); + } + + function testFuzz_revert_invalidOperatorSet(bytes32 salt) public { + // Register Operator to M2 + address operator = cheats.addr(delegationSignerPrivateKey); + _registerOperatorLegacyM2(delegationSignerPrivateKey, salt); + + // Format calldata + operators = new address[](1); + operators[0] = operator; + operatorSetIds = new uint32[][](1); + operatorSetIds[0] = new uint32[](1); + operatorSetIds[0][0] = 1; + + // Become operator set AVS + avsDirectory.becomeOperatorSetAVS(); + + // Revert + cheats.expectRevert("AVSDirectory._registerOperatorToOperatorSets: invalid operator set"); + avsDirectory.migrateOperatorsToOperatorSets(operators, operatorSetIds); + } + + function testFuzz_revert_operatorAlreadyRegisteredFromMigration(bytes32 salt) public { + // Register Operator to M2 + address operator = cheats.addr(delegationSignerPrivateKey); + _registerOperatorLegacyM2(delegationSignerPrivateKey, salt); + + // Format calldata + operators = new address[](1); + operators[0] = operator; + operatorSetIds = new uint32[][](1); + operatorSetIds[0] = new uint32[](2); + operatorSetIds[0][0] = 1; + operatorSetIds[0][1] = 1; + + // Become operator set AVS + _createOperatorSet(1); + avsDirectory.becomeOperatorSetAVS(); + + // Revert + cheats.expectRevert("AVSDirectory._registerOperatorToOperatorSets: operator already registered to operator set"); + avsDirectory.migrateOperatorsToOperatorSets(operators, operatorSetIds); + } + + function testFuzz_revert_operatorAlreadyRegisteredFromNormalReg(bytes32 salt1, bytes32 salt2) public { + // Register Operator to M2 + address operator = cheats.addr(delegationSignerPrivateKey); + _registerOperatorLegacyM2(delegationSignerPrivateKey, salt1); + + // Format calldata + operators = new address[](1); + operators[0] = operator; + operatorSetIds = new uint32[][](1); + operatorSetIds[0] = new uint32[](1); + operatorSetIds[0][0] = 1; + + // Register Operator To Operator Set - cannot use helper method since it re-registers operator in DM + avsDirectory.becomeOperatorSetAVS(); + _createOperatorSet(1); + uint256 expiry = type(uint256).max; + (uint8 v, bytes32 r, bytes32 s) = cheats.sign( + delegationSignerPrivateKey, + avsDirectory.calculateOperatorSetRegistrationDigestHash(address(this), operatorSetIds[0], salt2, expiry) + ); + avsDirectory.registerOperatorToOperatorSets( + operator, + operatorSetIds[0], + ISignatureUtils.SignatureWithSaltAndExpiry(abi.encodePacked(r, s, v), salt2, expiry) + ); + + // Revert + cheats.expectRevert("AVSDirectory._registerOperatorToOperatorSets: operator already registered to operator set"); + avsDirectory.migrateOperatorsToOperatorSets(operators, operatorSetIds); + } + + function testFuzz_Correctness(bytes32 salt) public { + // Register Operator to M2 + address operator = cheats.addr(delegationSignerPrivateKey); + _registerOperatorLegacyM2(delegationSignerPrivateKey, salt); + + // Format calldata + operators = new address[](1); + operators[0] = operator; + operatorSetIds = new uint32[][](1); + operatorSetIds[0] = new uint32[](1); + operatorSetIds[0][0] = 1; + + // Become operator set AVS + avsDirectory.becomeOperatorSetAVS(); + _createOperatorSet(1); + + // Expect Emits + cheats.expectEmit(true, true, true, true, address(avsDirectory)); + emit OperatorAddedToOperatorSet(operator, OperatorSet(address(this), 1)); + cheats.expectEmit(true, true, true, true, address(avsDirectory)); + emit OperatorAVSRegistrationStatusUpdated( + operator, address(this), IAVSDirectory.OperatorAVSRegistrationStatus.UNREGISTERED + ); + cheats.expectEmit(true, true, true, true, address(avsDirectory)); + emit OperatorMigratedToOperatorSets(operator, address(this), operatorSetIds[0]); + + // Migrate + avsDirectory.migrateOperatorsToOperatorSets(operators, operatorSetIds); + + // Checks + assertTrue(avsDirectory.isMember(operator, OperatorSet(address(this), 1))); + assertTrue( + avsDirectory.avsOperatorStatus(address(this), operator) + == IAVSDirectory.OperatorAVSRegistrationStatus.UNREGISTERED + ); + assertEq(avsDirectory.getNumOperatorsInOperatorSet(OperatorSet(address(this), 1)), 1); + } + + function testFuzz_correctness_multiple( + uint256 privateKey, + uint8 numOperators, + bytes32 salt, + uint8 numOids + ) public { + numOperators = uint8(bound(numOperators, 1, 64)); + numOids = uint8(bound(numOids, 1, 32)); + + // Create Operator Set IDs + uint32[] memory oids = new uint32[](numOids); + for (uint32 i = 0; i < numOids; i++) { + oids[i] = i; + } + + // Create Operators, Initailize Calldata, Register Operators + privateKey = bound(privateKey, 1, MAX_PRIVATE_KEY - numOperators); + operators = new address[](numOperators); + operatorSetIds = new uint32[][](numOperators); + for (uint256 i = 0; i < numOperators; i++) { + _registerOperatorLegacyM2(privateKey + i, salt); + operators[i] = cheats.addr(privateKey + i); + operatorSetIds[i] = oids; + } + + // Become operator set AVS + avsDirectory.becomeOperatorSetAVS(); + _createOperatorSets(oids); + + // Expect Emits + for (uint256 i = 0; i < numOperators; i++) { + for (uint256 j = 0; j < oids.length; j++) { + cheats.expectEmit(true, true, true, true, address(avsDirectory)); + emit OperatorAddedToOperatorSet(operators[i], OperatorSet(address(this), oids[j])); + } + cheats.expectEmit(true, true, true, true, address(avsDirectory)); + emit OperatorAVSRegistrationStatusUpdated( + operators[i], address(this), IAVSDirectory.OperatorAVSRegistrationStatus.UNREGISTERED + ); + cheats.expectEmit(true, true, true, true, address(avsDirectory)); + emit OperatorMigratedToOperatorSets(operators[i], address(this), operatorSetIds[i]); + } + + // Migrate + avsDirectory.migrateOperatorsToOperatorSets(operators, operatorSetIds); + + // Checks + for (uint256 i = 0; i < numOperators; i++) { + for (uint256 j = 0; j < oids.length; j++) { + assertTrue(avsDirectory.isMember(operators[i], OperatorSet(address(this), oids[j]))); + } + assertTrue( + avsDirectory.avsOperatorStatus(address(this), operators[i]) + == IAVSDirectory.OperatorAVSRegistrationStatus.UNREGISTERED + ); + + OperatorSet[] memory opSets = avsDirectory.getOperatorSetsOfOperator(operators[i], 0, type(uint256).max); + assertEq(oids.length, opSets.length); + } + + for(uint256 i = 0; i < oids.length; i++) { + address[] memory operatorsInSet = avsDirectory.getOperatorsInOperatorSet(OperatorSet(address(this), oids[i]), 0, type(uint256).max); + assertEq(operatorsInSet.length, operators.length); + } + } + + function _registerOperatorLegacyM2(uint256 privateKey, bytes32 salt) internal { + address operator = cheats.addr(privateKey); + _registerOperatorWithBaseDetails(operator); + + uint256 expiry = type(uint256).max; + ISignatureUtils.SignatureWithSaltAndExpiry memory operatorSignature = + _getOperatorAVSRegistrationSignature(privateKey, operator, address(this), salt, expiry); + + avsDirectory.registerOperatorToAVS(operator, operatorSignature); + } +} + +contract AVSDirectoryUnitTests_legacyOperatorAVSRegistration is AVSDirectoryUnitTests { function test_revert_whenRegisterDeregisterToAVSPaused() public { // set the pausing flag cheats.prank(pauser); avsDirectory.pause(2 ** PAUSED_OPERATOR_REGISTER_DEREGISTER_TO_AVS); cheats.expectRevert("Pausable: index is paused"); - avsDirectory.registerOperatorToAVS(address(0), ISignatureUtils.SignatureWithSaltAndExpiry(abi.encodePacked(""), 0, 0)); + avsDirectory.registerOperatorToAVS( + address(0), ISignatureUtils.SignatureWithSaltAndExpiry(abi.encodePacked(""), 0, 0) + ); cheats.expectRevert("Pausable: index is paused"); avsDirectory.deregisterOperatorFromAVS(address(0)); } + function test_revert_deregisterOperatorFromAVS_operatorNotRegistered() public { + cheats.expectRevert("AVSDirectory.deregisterOperatorFromAVS: operator not registered"); + avsDirectory.deregisterOperatorFromAVS(address(0)); + } + + function test_revert_deregisterOperatorFromAVS_whenAVSISOperatorSetAVS() public { + // Register operator + bytes32 salt = bytes32(0); + address operator = cheats.addr(delegationSignerPrivateKey); + assertFalse(delegationManager.isOperator(operator), "bad test setup"); + _registerOperatorWithBaseDetails(operator); + + uint256 expiry = type(uint256).max; + ISignatureUtils.SignatureWithSaltAndExpiry memory operatorSignature = + _getOperatorAVSRegistrationSignature(delegationSignerPrivateKey, operator, defaultAVS, salt, expiry); + + cheats.startPrank(defaultAVS); + avsDirectory.registerOperatorToAVS(operator, operatorSignature); + + // Become operator set AVS + avsDirectory.becomeOperatorSetAVS(); + + // Deregister operator + cheats.expectRevert("AVSDirectory.deregisterOperatorFromAVS: AVS is an operator set AVS"); + avsDirectory.deregisterOperatorFromAVS(operator); + } + + function testFuzz_deregisterOperatorFromAVS(bytes32 salt) public { + address operator = cheats.addr(delegationSignerPrivateKey); + assertFalse(delegationManager.isOperator(operator), "bad test setup"); + _registerOperatorWithBaseDetails(operator); + + uint256 expiry = type(uint256).max; + ISignatureUtils.SignatureWithSaltAndExpiry memory operatorSignature = + _getOperatorAVSRegistrationSignature(delegationSignerPrivateKey, operator, defaultAVS, salt, expiry); + + cheats.prank(defaultAVS); + avsDirectory.registerOperatorToAVS(operator, operatorSignature); + + cheats.expectEmit(true, true, true, true, address(avsDirectory)); + emit OperatorAVSRegistrationStatusUpdated( + operator, defaultAVS, IAVSDirectory.OperatorAVSRegistrationStatus.UNREGISTERED + ); + + cheats.prank(defaultAVS); + avsDirectory.deregisterOperatorFromAVS(operator); + + assertTrue( + avsDirectory.avsOperatorStatus(defaultAVS, operator) + == IAVSDirectory.OperatorAVSRegistrationStatus.UNREGISTERED + ); + } + // @notice Tests that an avs who calls `updateAVSMetadataURI` will correctly see an `AVSMetadataURIUpdated` event emitted with their input function testFuzz_UpdateAVSMetadataURI(string memory metadataURI) public { // call `updateAVSMetadataURI` and check for event @@ -192,6 +1295,25 @@ contract AVSDirectoryUnitTests_operatorAVSRegisterationStatus is AVSDirectoryUni avsDirectory.updateAVSMetadataURI(metadataURI); } + function testFuzz_revert_whenAVSIsOperatorSetAVS(bytes32 salt) public { + // set the AVS to be an operator set AVS + cheats.prank(defaultAVS); + avsDirectory.becomeOperatorSetAVS(); + + // Register Operator to EigenLayer + address operator = cheats.addr(delegationSignerPrivateKey); + assertFalse(delegationManager.isOperator(operator), "bad test setup"); + _registerOperatorWithBaseDetails(operator); + + uint256 expiry = type(uint256).max; + + cheats.prank(defaultAVS); + ISignatureUtils.SignatureWithSaltAndExpiry memory operatorSignature = + _getOperatorAVSRegistrationSignature(delegationSignerPrivateKey, operator, defaultAVS, salt, expiry); + cheats.expectRevert("AVSDirectory.registerOperatorToAVS: AVS is an operator set AVS"); + avsDirectory.registerOperatorToAVS(operator, operatorSignature); + } + // @notice Verifies an operator registers successfull to avs and see an `OperatorAVSRegistrationStatusUpdated` event emitted function testFuzz_registerOperatorToAVS(bytes32 salt) public { address operator = cheats.addr(delegationSignerPrivateKey); @@ -207,9 +1329,14 @@ contract AVSDirectoryUnitTests_operatorAVSRegisterationStatus is AVSDirectoryUni cheats.prank(defaultAVS); ISignatureUtils.SignatureWithSaltAndExpiry memory operatorSignature = - _getOperatorSignature(delegationSignerPrivateKey, operator, defaultAVS, salt, expiry); + _getOperatorAVSRegistrationSignature(delegationSignerPrivateKey, operator, defaultAVS, salt, expiry); avsDirectory.registerOperatorToAVS(operator, operatorSignature); + + assertTrue( + avsDirectory.avsOperatorStatus(defaultAVS, operator) + == IAVSDirectory.OperatorAVSRegistrationStatus.REGISTERED + ); } // @notice Verifies an operator registers successfull to avs and see an `OperatorAVSRegistrationStatusUpdated` event emitted @@ -220,7 +1347,7 @@ contract AVSDirectoryUnitTests_operatorAVSRegisterationStatus is AVSDirectoryUni cheats.prank(defaultAVS); uint256 expiry = type(uint256).max; ISignatureUtils.SignatureWithSaltAndExpiry memory operatorSignature = - _getOperatorSignature(delegationSignerPrivateKey, operator, defaultAVS, salt, expiry); + _getOperatorAVSRegistrationSignature(delegationSignerPrivateKey, operator, defaultAVS, salt, expiry); cheats.expectRevert("AVSDirectory.registerOperatorToAVS: operator not registered to EigenLayer yet"); avsDirectory.registerOperatorToAVS(operator, operatorSignature); @@ -234,7 +1361,7 @@ contract AVSDirectoryUnitTests_operatorAVSRegisterationStatus is AVSDirectoryUni uint256 expiry = type(uint256).max; ISignatureUtils.SignatureWithSaltAndExpiry memory operatorSignature = - _getOperatorSignature(delegationSignerPrivateKey, operator, defaultAVS, salt, expiry); + _getOperatorAVSRegistrationSignature(delegationSignerPrivateKey, operator, defaultAVS, salt, expiry); cheats.expectRevert("EIP1271SignatureUtils.checkSignature_EIP1271: signature not from signer"); cheats.prank(operator); @@ -242,9 +1369,9 @@ contract AVSDirectoryUnitTests_operatorAVSRegisterationStatus is AVSDirectoryUni } // @notice Verifies an operator registers fails when the signature expiry already expires - function testFuzz_revert_whenExpiryHasExpired( - ISignatureUtils.SignatureWithSaltAndExpiry memory operatorSignature - ) public { + function testFuzz_revert_whenExpiryHasExpired(ISignatureUtils.SignatureWithSaltAndExpiry memory operatorSignature) + public + { address operator = cheats.addr(delegationSignerPrivateKey); operatorSignature.expiry = bound(operatorSignature.expiry, 0, block.timestamp - 1); @@ -260,7 +1387,7 @@ contract AVSDirectoryUnitTests_operatorAVSRegisterationStatus is AVSDirectoryUni uint256 expiry = type(uint256).max; ISignatureUtils.SignatureWithSaltAndExpiry memory operatorSignature = - _getOperatorSignature(delegationSignerPrivateKey, operator, defaultAVS, salt, expiry); + _getOperatorAVSRegistrationSignature(delegationSignerPrivateKey, operator, defaultAVS, salt, expiry); cheats.startPrank(defaultAVS); avsDirectory.registerOperatorToAVS(operator, operatorSignature); @@ -283,10 +1410,14 @@ contract AVSDirectoryUnitTests_operatorAVSRegisterationStatus is AVSDirectoryUni avsDirectory.cancelSalt(salt); assertTrue(avsDirectory.operatorSaltIsSpent(operator, salt), "salt was not successfully cancelled"); - assertFalse(avsDirectory.operatorSaltIsSpent(defaultAVS, salt), "salt should only be cancelled for the operator"); + assertFalse( + avsDirectory.operatorSaltIsSpent(defaultAVS, salt), "salt should only be cancelled for the operator" + ); - bytes32 newSalt; - unchecked { newSalt = bytes32(uint(salt) + 1); } + bytes32 newSalt; + unchecked { + newSalt = bytes32(uint256(salt) + 1); + } assertFalse(salt == newSalt, "bad test setup"); @@ -305,7 +1436,7 @@ contract AVSDirectoryUnitTests_operatorAVSRegisterationStatus is AVSDirectoryUni uint256 expiry = type(uint256).max; ISignatureUtils.SignatureWithSaltAndExpiry memory operatorSignature = - _getOperatorSignature(delegationSignerPrivateKey, operator, defaultAVS, salt, expiry); + _getOperatorAVSRegistrationSignature(delegationSignerPrivateKey, operator, defaultAVS, salt, expiry); cheats.prank(operator); avsDirectory.cancelSalt(salt); @@ -315,20 +1446,6 @@ contract AVSDirectoryUnitTests_operatorAVSRegisterationStatus is AVSDirectoryUni avsDirectory.registerOperatorToAVS(operator, operatorSignature); } - /// @notice Verifies that an operator cannot cancel the same salt twice - function testFuzz_revert_whenSaltCancelledTwice(bytes32 salt) public { - address operator = cheats.addr(delegationSignerPrivateKey); - assertFalse(delegationManager.isOperator(operator), "bad test setup"); - _registerOperatorWithBaseDetails(operator); - - cheats.startPrank(operator); - avsDirectory.cancelSalt(salt); - - cheats.expectRevert("AVSDirectory.cancelSalt: cannot cancel spent salt"); - avsDirectory.cancelSalt(salt); - cheats.stopPrank(); - } - /// @notice Verifies that an operator cannot cancel the same salt twice function testFuzz_revert_whenCancellingSaltUsedToRegister(bytes32 salt) public { address operator = cheats.addr(delegationSignerPrivateKey); @@ -337,13 +1454,9 @@ contract AVSDirectoryUnitTests_operatorAVSRegisterationStatus is AVSDirectoryUni uint256 expiry = type(uint256).max; ISignatureUtils.SignatureWithSaltAndExpiry memory operatorSignature = - _getOperatorSignature(delegationSignerPrivateKey, operator, defaultAVS, salt, expiry); + _getOperatorAVSRegistrationSignature(delegationSignerPrivateKey, operator, defaultAVS, salt, expiry); cheats.prank(defaultAVS); avsDirectory.registerOperatorToAVS(operator, operatorSignature); - - cheats.prank(operator); - cheats.expectRevert("AVSDirectory.cancelSalt: cannot cancel spent salt"); - avsDirectory.cancelSalt(salt); } } diff --git a/src/test/unit/DelegationUnit.t.sol b/src/test/unit/DelegationUnit.t.sol index 79bf46daf..b4ef25f2f 100644 --- a/src/test/unit/DelegationUnit.t.sol +++ b/src/test/unit/DelegationUnit.t.sol @@ -1,3324 +1,3324 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.12; - -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/events/IDelegationManagerEvents.sol"; -import "src/test/utils/EigenLayerUnitTestSetup.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 { - // Contract under test - DelegationManager delegationManager; - DelegationManager delegationManagerImplementation; - - // Mocks - StrategyBase strategyImplementation; - StrategyBase strategyMock; - IERC20 mockToken; - uint256 mockTokenInitialSupply = 10e50; - - // Delegation signer - uint256 delegationSignerPrivateKey = uint256(0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80); - uint256 stakerPrivateKey = uint256(123_456_789); - - // empty string reused across many tests - string emptyStringForMetadataURI; - - // "empty" / zero salt, reused across many tests - bytes32 emptySalt; - - // reused in various tests. in storage to help handle stack-too-deep errors - address defaultStaker = cheats.addr(uint256(123_456_789)); - address defaultOperator = address(this); - address defaultApprover = cheats.addr(delegationSignerPrivateKey); - address defaultAVS = address(this); - - // 604800 seconds in week / 12 = 50,400 blocks - uint256 minWithdrawalDelayBlocks = 50400; - IStrategy[] public initializeStrategiesToSetDelayBlocks; - uint256[] public initializeWithdrawalDelayBlocks; - - IStrategy public constant beaconChainETHStrategy = IStrategy(0xbeaC0eeEeeeeEEeEeEEEEeeEEeEeeeEeeEEBEaC0); - - // Index for flag that pauses new delegations when set. - uint8 internal constant PAUSED_NEW_DELEGATION = 0; - - // Index for flag that pauses queuing new withdrawals when set. - uint8 internal constant PAUSED_ENTER_WITHDRAWAL_QUEUE = 1; - - // Index for flag that pauses completing existing withdrawals when set. - uint8 internal constant PAUSED_EXIT_WITHDRAWAL_QUEUE = 2; - - // the number of 12-second blocks in 30 days (60 * 60 * 24 * 30 / 12 = 216,000) - uint256 public constant MAX_WITHDRAWAL_DELAY_BLOCKS = 216000; - - /// @notice mappings used to handle duplicate entries in fuzzed address array input - mapping(address => uint256) public totalSharesForStrategyInArray; - mapping(IStrategy => uint256) public delegatedSharesBefore; - - function setUp() public virtual override { - // Setup - EigenLayerUnitTestSetup.setUp(); - - // Deploy DelegationManager implmentation and proxy - initializeStrategiesToSetDelayBlocks = new IStrategy[](0); - initializeWithdrawalDelayBlocks = new uint256[](0); - delegationManagerImplementation = new DelegationManager(strategyManagerMock, slasherMock, eigenPodManagerMock); - delegationManager = DelegationManager( - address( - new TransparentUpgradeableProxy( - address(delegationManagerImplementation), - address(eigenLayerProxyAdmin), - abi.encodeWithSelector( - DelegationManager.initialize.selector, - address(this), - pauserRegistry, - 0, // 0 is initialPausedStatus - minWithdrawalDelayBlocks, - initializeStrategiesToSetDelayBlocks, - initializeWithdrawalDelayBlocks - ) - ) - ) - ); - - // Deploy mock token and strategy - mockToken = new ERC20PresetFixedSupply("Mock Token", "MOCK", mockTokenInitialSupply, address(this)); - strategyImplementation = new StrategyBase(strategyManagerMock); - strategyMock = StrategyBase( - address( - new TransparentUpgradeableProxy( - address(strategyImplementation), - address(eigenLayerProxyAdmin), - abi.encodeWithSelector(StrategyBase.initialize.selector, mockToken, pauserRegistry) - ) - ) - ); - - // Exclude delegation manager from fuzzed tests - addressIsExcludedFromFuzzedInputs[address(delegationManager)] = true; - addressIsExcludedFromFuzzedInputs[defaultApprover] = true; - } - - /** - * 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, - uint256[] memory sharesAmounts - ) internal returns (IStrategy[] memory) { - uint256 numStrats = sharesAmounts.length; - IStrategy[] memory strategies = new IStrategy[](numStrats); - uint256[] memory withdrawalDelayBlocks = new uint256[](strategies.length); - for (uint8 i = 0; i < numStrats; i++) { - withdrawalDelayBlocks[i] = bound(uint256(keccak256(abi.encode(staker, i))), 0, MAX_WITHDRAWAL_DELAY_BLOCKS); - ERC20PresetFixedSupply token = new ERC20PresetFixedSupply( - string(abi.encodePacked("Mock Token ", i)), - string(abi.encodePacked("MOCK", i)), - mockTokenInitialSupply, - address(this) - ); - strategies[i] = StrategyBase( - address( - new TransparentUpgradeableProxy( - address(strategyImplementation), - address(eigenLayerProxyAdmin), - abi.encodeWithSelector(StrategyBase.initialize.selector, token, pauserRegistry) - ) - ) - ); - } - delegationManager.setStrategyWithdrawalDelayBlocks(strategies, withdrawalDelayBlocks); - strategyManagerMock.setDeposits(staker, strategies, sharesAmounts); - return strategies; - } - - /** - * @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( - uint256 _delegationSignerPrivateKey, - address staker, - address operator, - bytes32 salt, - uint256 expiry - ) internal view returns (ISignatureUtils.SignatureWithExpiry memory approverSignatureAndExpiry) { - approverSignatureAndExpiry.expiry = expiry; - { - bytes32 digestHash = delegationManager.calculateDelegationApprovalDigestHash( - staker, - operator, - delegationManager.delegationApprover(operator), - salt, - expiry - ); - (uint8 v, bytes32 r, bytes32 s) = cheats.sign(_delegationSignerPrivateKey, digestHash); - approverSignatureAndExpiry.signature = abi.encodePacked(r, s, v); - } - return approverSignatureAndExpiry; - } - - /** - * @notice internal function for calculating a signature from the staker corresponding to `_stakerPrivateKey`, delegating them to - * the `operator`, and expiring at `expiry`. - */ - function _getStakerSignature( - uint256 _stakerPrivateKey, - address operator, - uint256 expiry - ) internal view returns (ISignatureUtils.SignatureWithExpiry memory stakerSignatureAndExpiry) { - address staker = cheats.addr(stakerPrivateKey); - stakerSignatureAndExpiry.expiry = expiry; - { - bytes32 digestHash = delegationManager.calculateCurrentStakerDelegationDigestHash(staker, operator, expiry); - (uint8 v, bytes32 r, bytes32 s) = cheats.sign(_stakerPrivateKey, digestHash); - stakerSignatureAndExpiry.signature = abi.encodePacked(r, s, v); - } - return stakerSignatureAndExpiry; - } - - // @notice Assumes operator does not have a delegation approver & staker != approver - function _delegateToOperatorWhoAcceptsAllStakers(address staker, address operator) internal { - ISignatureUtils.SignatureWithExpiry memory approverSignatureAndExpiry; - cheats.prank(staker); - delegationManager.delegateTo(operator, approverSignatureAndExpiry, emptySalt); - } - - function _delegateToOperatorWhoRequiresSig(address staker, address operator, bytes32 salt) internal { - uint256 expiry = type(uint256).max; - ISignatureUtils.SignatureWithExpiry memory approverSignatureAndExpiry = _getApproverSignature( - delegationSignerPrivateKey, - staker, - operator, - salt, - expiry - ); - cheats.prank(staker); - delegationManager.delegateTo(operator, approverSignatureAndExpiry, salt); - } - - function _delegateToOperatorWhoRequiresSig(address staker, address operator) internal { - _delegateToOperatorWhoRequiresSig(staker, operator, emptySalt); - } - - function _delegateToBySignatureOperatorWhoAcceptsAllStakers( - address staker, - address caller, - address operator, - ISignatureUtils.SignatureWithExpiry memory stakerSignatureAndExpiry, - bytes32 salt - ) internal { - ISignatureUtils.SignatureWithExpiry memory approverSignatureAndExpiry; - cheats.prank(caller); - delegationManager.delegateToBySignature( - staker, - operator, - stakerSignatureAndExpiry, - approverSignatureAndExpiry, - salt - ); - } - - function _delegateToBySignatureOperatorWhoRequiresSig( - address staker, - address caller, - address operator, - ISignatureUtils.SignatureWithExpiry memory stakerSignatureAndExpiry, - bytes32 salt - ) internal { - uint256 expiry = type(uint256).max; - ISignatureUtils.SignatureWithExpiry memory approverSignatureAndExpiry = _getApproverSignature( - delegationSignerPrivateKey, - staker, - operator, - salt, - expiry - ); - cheats.prank(caller); - delegationManager.delegateToBySignature( - staker, - operator, - stakerSignatureAndExpiry, - approverSignatureAndExpiry, - salt - ); - } - - function _registerOperatorWithBaseDetails(address operator) internal { - IDelegationManager.OperatorDetails memory operatorDetails = IDelegationManager.OperatorDetails({ - __deprecated_earningsReceiver: operator, - delegationApprover: address(0), - stakerOptOutWindowBlocks: 0 - }); - _registerOperator(operator, operatorDetails, emptyStringForMetadataURI); - } - - function _registerOperatorWithDelegationApprover(address operator) internal { - IDelegationManager.OperatorDetails memory operatorDetails = IDelegationManager.OperatorDetails({ - __deprecated_earningsReceiver: operator, - delegationApprover: defaultApprover, - stakerOptOutWindowBlocks: 0 - }); - _registerOperator(operator, operatorDetails, emptyStringForMetadataURI); - } - - function _registerOperatorWith1271DelegationApprover(address operator) internal returns (ERC1271WalletMock) { - address delegationSigner = defaultApprover; - /** - * 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 - */ - ERC1271WalletMock wallet = new ERC1271WalletMock(delegationSigner); - - IDelegationManager.OperatorDetails memory operatorDetails = IDelegationManager.OperatorDetails({ - __deprecated_earningsReceiver: operator, - delegationApprover: address(wallet), - stakerOptOutWindowBlocks: 0 - }); - _registerOperator(operator, operatorDetails, emptyStringForMetadataURI); - - return wallet; - } - - function _registerOperator( - address operator, - IDelegationManager.OperatorDetails memory operatorDetails, - string memory metadataURI - ) internal filterFuzzedAddressInputs(operator) { - _filterOperatorDetails(operator, operatorDetails); - cheats.prank(operator); - delegationManager.registerAsOperator(operatorDetails, metadataURI); - } - - function _filterOperatorDetails( - address operator, - IDelegationManager.OperatorDetails memory operatorDetails - ) internal view { - // filter out zero address since people can't delegate to the zero address and operators are delegated to themselves - cheats.assume(operator != address(0)); - // filter out disallowed stakerOptOutWindowBlocks values - cheats.assume(operatorDetails.stakerOptOutWindowBlocks <= delegationManager.MAX_STAKER_OPT_OUT_WINDOW_BLOCKS()); - } - - /** - * @notice Using this helper function to fuzz withdrawalAmounts since fuzzing two dynamic sized arrays of equal lengths - * reject too many inputs. - */ - function _fuzzWithdrawalAmounts(uint256[] memory depositAmounts) internal view returns (uint256[] memory) { - uint256[] memory withdrawalAmounts = new uint256[](depositAmounts.length); - for (uint256 i = 0; i < depositAmounts.length; i++) { - cheats.assume(depositAmounts[i] > 0); - // generate withdrawal amount within range s.t withdrawAmount <= depositAmount - withdrawalAmounts[i] = bound( - uint256(keccak256(abi.encodePacked(depositAmounts[i]))), - 0, - depositAmounts[i] - ); - } - return withdrawalAmounts; - } - - function _setUpQueueWithdrawalsSingleStrat( - address staker, - address withdrawer, - IStrategy strategy, - uint256 withdrawalAmount - ) internal view returns ( - IDelegationManager.QueuedWithdrawalParams[] memory, - IDelegationManager.Withdrawal memory, - bytes32 - ) { - IStrategy[] memory strategyArray = new IStrategy[](1); - strategyArray[0] = strategy; - uint256[] memory withdrawalAmounts = new uint256[](1); - withdrawalAmounts[0] = withdrawalAmount; - - IDelegationManager.QueuedWithdrawalParams[] memory queuedWithdrawalParams = new IDelegationManager.QueuedWithdrawalParams[](1); - queuedWithdrawalParams[0] = IDelegationManager.QueuedWithdrawalParams({ - strategies: strategyArray, - shares: withdrawalAmounts, - withdrawer: withdrawer - }); - - IDelegationManager.Withdrawal memory withdrawal = IDelegationManager.Withdrawal({ - staker: staker, - delegatedTo: delegationManager.delegatedTo(staker), - withdrawer: withdrawer, - nonce: delegationManager.cumulativeWithdrawalsQueued(staker), - startBlock: uint32(block.number), - strategies: strategyArray, - shares: withdrawalAmounts - }); - bytes32 withdrawalRoot = delegationManager.calculateWithdrawalRoot(withdrawal); +// // SPDX-License-Identifier: BUSL-1.1 +// pragma solidity ^0.8.27; + +// 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/events/IDelegationManagerEvents.sol"; +// import "src/test/utils/EigenLayerUnitTestSetup.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 { +// // Contract under test +// DelegationManager delegationManager; +// DelegationManager delegationManagerImplementation; + +// // Mocks +// StrategyBase strategyImplementation; +// StrategyBase strategyMock; +// IERC20 mockToken; +// uint256 mockTokenInitialSupply = 10e50; + +// // Delegation signer +// uint256 delegationSignerPrivateKey = uint256(0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80); +// uint256 stakerPrivateKey = uint256(123_456_789); + +// // empty string reused across many tests +// string emptyStringForMetadataURI; + +// // "empty" / zero salt, reused across many tests +// bytes32 emptySalt; + +// // reused in various tests. in storage to help handle stack-too-deep errors +// address defaultStaker = cheats.addr(uint256(123_456_789)); +// address defaultOperator = address(this); +// address defaultApprover = cheats.addr(delegationSignerPrivateKey); +// address defaultAVS = address(this); + +// // 604800 seconds in week / 12 = 50,400 blocks +// uint256 minWithdrawalDelayBlocks = 50400; +// IStrategy[] public initializeStrategiesToSetDelayBlocks; +// uint256[] public initializeWithdrawalDelayBlocks; + +// IStrategy public constant beaconChainETHStrategy = IStrategy(0xbeaC0eeEeeeeEEeEeEEEEeeEEeEeeeEeeEEBEaC0); + +// // Index for flag that pauses new delegations when set. +// uint8 internal constant PAUSED_NEW_DELEGATION = 0; + +// // Index for flag that pauses queuing new withdrawals when set. +// uint8 internal constant PAUSED_ENTER_WITHDRAWAL_QUEUE = 1; + +// // Index for flag that pauses completing existing withdrawals when set. +// uint8 internal constant PAUSED_EXIT_WITHDRAWAL_QUEUE = 2; + +// // the number of 12-second blocks in 30 days (60 * 60 * 24 * 30 / 12 = 216,000) +// uint256 public constant MAX_WITHDRAWAL_DELAY_BLOCKS = 216000; + +// /// @notice mappings used to handle duplicate entries in fuzzed address array input +// mapping(address => uint256) public totalSharesForStrategyInArray; +// mapping(IStrategy => uint256) public delegatedSharesBefore; + +// function setUp() public virtual override { +// // Setup +// EigenLayerUnitTestSetup.setUp(); + +// // Deploy DelegationManager implmentation and proxy +// initializeStrategiesToSetDelayBlocks = new IStrategy[](0); +// initializeWithdrawalDelayBlocks = new uint256[](0); +// delegationManagerImplementation = new DelegationManager(strategyManagerMock, slasherMock, eigenPodManagerMock); +// delegationManager = DelegationManager( +// address( +// new TransparentUpgradeableProxy( +// address(delegationManagerImplementation), +// address(eigenLayerProxyAdmin), +// abi.encodeWithSelector( +// DelegationManager.initialize.selector, +// address(this), +// pauserRegistry, +// 0, // 0 is initialPausedStatus +// minWithdrawalDelayBlocks, +// initializeStrategiesToSetDelayBlocks, +// initializeWithdrawalDelayBlocks +// ) +// ) +// ) +// ); + +// // Deploy mock token and strategy +// mockToken = new ERC20PresetFixedSupply("Mock Token", "MOCK", mockTokenInitialSupply, address(this)); +// strategyImplementation = new StrategyBase(strategyManagerMock); +// strategyMock = StrategyBase( +// address( +// new TransparentUpgradeableProxy( +// address(strategyImplementation), +// address(eigenLayerProxyAdmin), +// abi.encodeWithSelector(StrategyBase.initialize.selector, mockToken, pauserRegistry) +// ) +// ) +// ); + +// // Exclude delegation manager from fuzzed tests +// addressIsExcludedFromFuzzedInputs[address(delegationManager)] = true; +// addressIsExcludedFromFuzzedInputs[defaultApprover] = true; +// } + +// /** +// * 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, +// uint256[] memory sharesAmounts +// ) internal returns (IStrategy[] memory) { +// uint256 numStrats = sharesAmounts.length; +// IStrategy[] memory strategies = new IStrategy[](numStrats); +// uint256[] memory withdrawalDelayBlocks = new uint256[](strategies.length); +// for (uint8 i = 0; i < numStrats; i++) { +// withdrawalDelayBlocks[i] = bound(uint256(keccak256(abi.encode(staker, i))), 0, MAX_WITHDRAWAL_DELAY_BLOCKS); +// ERC20PresetFixedSupply token = new ERC20PresetFixedSupply( +// string(abi.encodePacked("Mock Token ", i)), +// string(abi.encodePacked("MOCK", i)), +// mockTokenInitialSupply, +// address(this) +// ); +// strategies[i] = StrategyBase( +// address( +// new TransparentUpgradeableProxy( +// address(strategyImplementation), +// address(eigenLayerProxyAdmin), +// abi.encodeWithSelector(StrategyBase.initialize.selector, token, pauserRegistry) +// ) +// ) +// ); +// } +// delegationManager.setStrategyWithdrawalDelayBlocks(strategies, withdrawalDelayBlocks); +// strategyManagerMock.setDeposits(staker, strategies, sharesAmounts); +// return strategies; +// } + +// /** +// * @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( +// uint256 _delegationSignerPrivateKey, +// address staker, +// address operator, +// bytes32 salt, +// uint256 expiry +// ) internal view returns (ISignatureUtils.SignatureWithExpiry memory approverSignatureAndExpiry) { +// approverSignatureAndExpiry.expiry = expiry; +// { +// bytes32 digestHash = delegationManager.calculateDelegationApprovalDigestHash( +// staker, +// operator, +// delegationManager.delegationApprover(operator), +// salt, +// expiry +// ); +// (uint8 v, bytes32 r, bytes32 s) = cheats.sign(_delegationSignerPrivateKey, digestHash); +// approverSignatureAndExpiry.signature = abi.encodePacked(r, s, v); +// } +// return approverSignatureAndExpiry; +// } + +// /** +// * @notice internal function for calculating a signature from the staker corresponding to `_stakerPrivateKey`, delegating them to +// * the `operator`, and expiring at `expiry`. +// */ +// function _getStakerSignature( +// uint256 _stakerPrivateKey, +// address operator, +// uint256 expiry +// ) internal view returns (ISignatureUtils.SignatureWithExpiry memory stakerSignatureAndExpiry) { +// address staker = cheats.addr(stakerPrivateKey); +// stakerSignatureAndExpiry.expiry = expiry; +// { +// bytes32 digestHash = delegationManager.calculateCurrentStakerDelegationDigestHash(staker, operator, expiry); +// (uint8 v, bytes32 r, bytes32 s) = cheats.sign(_stakerPrivateKey, digestHash); +// stakerSignatureAndExpiry.signature = abi.encodePacked(r, s, v); +// } +// return stakerSignatureAndExpiry; +// } + +// // @notice Assumes operator does not have a delegation approver & staker != approver +// function _delegateToOperatorWhoAcceptsAllStakers(address staker, address operator) internal { +// ISignatureUtils.SignatureWithExpiry memory approverSignatureAndExpiry; +// cheats.prank(staker); +// delegationManager.delegateTo(operator, approverSignatureAndExpiry, emptySalt); +// } + +// function _delegateToOperatorWhoRequiresSig(address staker, address operator, bytes32 salt) internal { +// uint256 expiry = type(uint256).max; +// ISignatureUtils.SignatureWithExpiry memory approverSignatureAndExpiry = _getApproverSignature( +// delegationSignerPrivateKey, +// staker, +// operator, +// salt, +// expiry +// ); +// cheats.prank(staker); +// delegationManager.delegateTo(operator, approverSignatureAndExpiry, salt); +// } + +// function _delegateToOperatorWhoRequiresSig(address staker, address operator) internal { +// _delegateToOperatorWhoRequiresSig(staker, operator, emptySalt); +// } + +// function _delegateToBySignatureOperatorWhoAcceptsAllStakers( +// address staker, +// address caller, +// address operator, +// ISignatureUtils.SignatureWithExpiry memory stakerSignatureAndExpiry, +// bytes32 salt +// ) internal { +// ISignatureUtils.SignatureWithExpiry memory approverSignatureAndExpiry; +// cheats.prank(caller); +// delegationManager.delegateToBySignature( +// staker, +// operator, +// stakerSignatureAndExpiry, +// approverSignatureAndExpiry, +// salt +// ); +// } + +// function _delegateToBySignatureOperatorWhoRequiresSig( +// address staker, +// address caller, +// address operator, +// ISignatureUtils.SignatureWithExpiry memory stakerSignatureAndExpiry, +// bytes32 salt +// ) internal { +// uint256 expiry = type(uint256).max; +// ISignatureUtils.SignatureWithExpiry memory approverSignatureAndExpiry = _getApproverSignature( +// delegationSignerPrivateKey, +// staker, +// operator, +// salt, +// expiry +// ); +// cheats.prank(caller); +// delegationManager.delegateToBySignature( +// staker, +// operator, +// stakerSignatureAndExpiry, +// approverSignatureAndExpiry, +// salt +// ); +// } + +// function _registerOperatorWithBaseDetails(address operator) internal { +// IDelegationManager.OperatorDetails memory operatorDetails = IDelegationManager.OperatorDetails({ +// __deprecated_earningsReceiver: operator, +// delegationApprover: address(0), +// stakerOptOutWindowBlocks: 0 +// }); +// _registerOperator(operator, operatorDetails, emptyStringForMetadataURI); +// } + +// function _registerOperatorWithDelegationApprover(address operator) internal { +// IDelegationManager.OperatorDetails memory operatorDetails = IDelegationManager.OperatorDetails({ +// __deprecated_earningsReceiver: operator, +// delegationApprover: defaultApprover, +// stakerOptOutWindowBlocks: 0 +// }); +// _registerOperator(operator, operatorDetails, emptyStringForMetadataURI); +// } + +// function _registerOperatorWith1271DelegationApprover(address operator) internal returns (ERC1271WalletMock) { +// address delegationSigner = defaultApprover; +// /** +// * 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 +// */ +// ERC1271WalletMock wallet = new ERC1271WalletMock(delegationSigner); + +// IDelegationManager.OperatorDetails memory operatorDetails = IDelegationManager.OperatorDetails({ +// __deprecated_earningsReceiver: operator, +// delegationApprover: address(wallet), +// stakerOptOutWindowBlocks: 0 +// }); +// _registerOperator(operator, operatorDetails, emptyStringForMetadataURI); + +// return wallet; +// } + +// function _registerOperator( +// address operator, +// IDelegationManager.OperatorDetails memory operatorDetails, +// string memory metadataURI +// ) internal filterFuzzedAddressInputs(operator) { +// _filterOperatorDetails(operator, operatorDetails); +// cheats.prank(operator); +// delegationManager.registerAsOperator(operatorDetails, metadataURI); +// } + +// function _filterOperatorDetails( +// address operator, +// IDelegationManager.OperatorDetails memory operatorDetails +// ) internal view { +// // filter out zero address since people can't delegate to the zero address and operators are delegated to themselves +// cheats.assume(operator != address(0)); +// // filter out disallowed stakerOptOutWindowBlocks values +// cheats.assume(operatorDetails.stakerOptOutWindowBlocks <= delegationManager.MAX_STAKER_OPT_OUT_WINDOW_BLOCKS()); +// } + +// /** +// * @notice Using this helper function to fuzz withdrawalAmounts since fuzzing two dynamic sized arrays of equal lengths +// * reject too many inputs. +// */ +// function _fuzzWithdrawalAmounts(uint256[] memory depositAmounts) internal view returns (uint256[] memory) { +// uint256[] memory withdrawalAmounts = new uint256[](depositAmounts.length); +// for (uint256 i = 0; i < depositAmounts.length; i++) { +// cheats.assume(depositAmounts[i] > 0); +// // generate withdrawal amount within range s.t withdrawAmount <= depositAmount +// withdrawalAmounts[i] = bound( +// uint256(keccak256(abi.encodePacked(depositAmounts[i]))), +// 0, +// depositAmounts[i] +// ); +// } +// return withdrawalAmounts; +// } + +// function _setUpQueueWithdrawalsSingleStrat( +// address staker, +// address withdrawer, +// IStrategy strategy, +// uint256 withdrawalAmount +// ) internal view returns ( +// IDelegationManager.QueuedWithdrawalParams[] memory, +// IDelegationManager.Withdrawal memory, +// bytes32 +// ) { +// IStrategy[] memory strategyArray = new IStrategy[](1); +// strategyArray[0] = strategy; +// uint256[] memory withdrawalAmounts = new uint256[](1); +// withdrawalAmounts[0] = withdrawalAmount; + +// IDelegationManager.QueuedWithdrawalParams[] memory queuedWithdrawalParams = new IDelegationManager.QueuedWithdrawalParams[](1); +// queuedWithdrawalParams[0] = IDelegationManager.QueuedWithdrawalParams({ +// strategies: strategyArray, +// shares: withdrawalAmounts, +// withdrawer: withdrawer +// }); + +// IDelegationManager.Withdrawal memory withdrawal = IDelegationManager.Withdrawal({ +// staker: staker, +// delegatedTo: delegationManager.delegatedTo(staker), +// withdrawer: withdrawer, +// nonce: delegationManager.cumulativeWithdrawalsQueued(staker), +// startBlock: uint32(block.number), +// strategies: strategyArray, +// scaledShares: withdrawalAmounts +// }); +// bytes32 withdrawalRoot = delegationManager.calculateWithdrawalRoot(withdrawal); - return (queuedWithdrawalParams, withdrawal, withdrawalRoot); - } - - function _setUpQueueWithdrawals( - address staker, - address withdrawer, - IStrategy[] memory strategies, - uint256[] memory withdrawalAmounts - ) internal view returns ( - IDelegationManager.QueuedWithdrawalParams[] memory, - IDelegationManager.Withdrawal memory, - bytes32 - ) { - IDelegationManager.QueuedWithdrawalParams[] memory queuedWithdrawalParams = new IDelegationManager.QueuedWithdrawalParams[](1); - queuedWithdrawalParams[0] = IDelegationManager.QueuedWithdrawalParams({ - strategies: strategies, - shares: withdrawalAmounts, - withdrawer: withdrawer - }); +// return (queuedWithdrawalParams, withdrawal, withdrawalRoot); +// } + +// function _setUpQueueWithdrawals( +// address staker, +// address withdrawer, +// IStrategy[] memory strategies, +// uint256[] memory withdrawalAmounts +// ) internal view returns ( +// IDelegationManager.QueuedWithdrawalParams[] memory, +// IDelegationManager.Withdrawal memory, +// bytes32 +// ) { +// IDelegationManager.QueuedWithdrawalParams[] memory queuedWithdrawalParams = new IDelegationManager.QueuedWithdrawalParams[](1); +// queuedWithdrawalParams[0] = IDelegationManager.QueuedWithdrawalParams({ +// strategies: strategies, +// shares: withdrawalAmounts, +// withdrawer: withdrawer +// }); - IDelegationManager.Withdrawal memory withdrawal = IDelegationManager.Withdrawal({ - staker: staker, - delegatedTo: delegationManager.delegatedTo(staker), - withdrawer: withdrawer, - nonce: delegationManager.cumulativeWithdrawalsQueued(staker), - startBlock: uint32(block.number), - strategies: strategies, - shares: withdrawalAmounts - }); - bytes32 withdrawalRoot = delegationManager.calculateWithdrawalRoot(withdrawal); +// IDelegationManager.Withdrawal memory withdrawal = IDelegationManager.Withdrawal({ +// staker: staker, +// delegatedTo: delegationManager.delegatedTo(staker), +// withdrawer: withdrawer, +// nonce: delegationManager.cumulativeWithdrawalsQueued(staker), +// startBlock: uint32(block.number), +// strategies: strategies, +// scaledShares: withdrawalAmounts +// }); +// bytes32 withdrawalRoot = delegationManager.calculateWithdrawalRoot(withdrawal); - return (queuedWithdrawalParams, withdrawal, withdrawalRoot); - } - - /** - * 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( - address staker, - address withdrawer, - uint256 depositAmount, - uint256 withdrawalAmount - ) internal returns (IDelegationManager.Withdrawal memory, IERC20[] memory, bytes32) { - uint256[] memory depositAmounts = new uint256[](1); - depositAmounts[0] = depositAmount; - IStrategy[] memory strategies = _deployAndDepositIntoStrategies(staker, depositAmounts); - ( - IDelegationManager.QueuedWithdrawalParams[] memory queuedWithdrawalParams, - IDelegationManager.Withdrawal memory withdrawal, - bytes32 withdrawalRoot - ) = _setUpQueueWithdrawalsSingleStrat({ - staker: staker, - withdrawer: withdrawer, - strategy: strategies[0], - withdrawalAmount: withdrawalAmount - }); - - cheats.prank(staker); - delegationManager.queueWithdrawals(queuedWithdrawalParams); - // Set the current deposits to be the depositAmount - withdrawalAmount - uint256[] memory currentAmounts = new uint256[](1); - currentAmounts[0] = depositAmount - withdrawalAmount; - strategyManagerMock.setDeposits(staker, strategies, currentAmounts); - - IERC20[] memory tokens = new IERC20[](1); - tokens[0] = strategies[0].underlyingToken(); - return (withdrawal, tokens, withdrawalRoot); - } - - /** - * 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 _setUpCompleteQueuedWithdrawalBeaconStrat( - address staker, - address withdrawer, - uint256 depositAmount, - uint256 withdrawalAmount - ) internal returns (IDelegationManager.Withdrawal memory, IERC20[] memory, bytes32) { - uint256[] memory depositAmounts = new uint256[](1); - depositAmounts[0] = depositAmount; - IStrategy[] memory strategies = new IStrategy[](1); - strategies[0] = beaconChainETHStrategy; - ( - IDelegationManager.QueuedWithdrawalParams[] memory queuedWithdrawalParams, - IDelegationManager.Withdrawal memory withdrawal, - bytes32 withdrawalRoot - ) = _setUpQueueWithdrawalsSingleStrat({ - staker: staker, - withdrawer: withdrawer, - strategy: strategies[0], - withdrawalAmount: withdrawalAmount - }); - - cheats.prank(staker); - delegationManager.queueWithdrawals(queuedWithdrawalParams); - // Set the current deposits to be the depositAmount - withdrawalAmount - uint256[] memory currentAmounts = new uint256[](1); - currentAmounts[0] = depositAmount - withdrawalAmount; - strategyManagerMock.setDeposits(staker, strategies, currentAmounts); - - IERC20[] memory tokens; - // tokens[0] = strategies[0].underlyingToken(); - return (withdrawal, tokens, withdrawalRoot); - } - - /** - * 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( - address staker, - address withdrawer, - uint256[] memory depositAmounts, - uint256[] memory withdrawalAmounts - ) internal returns (IDelegationManager.Withdrawal memory, IERC20[] memory, bytes32) { - IStrategy[] memory strategies = _deployAndDepositIntoStrategies(staker, depositAmounts); - - IERC20[] memory tokens = new IERC20[](strategies.length); - for (uint256 i = 0; i < strategies.length; i++) { - tokens[i] = strategies[i].underlyingToken(); - } - - ( - IDelegationManager.QueuedWithdrawalParams[] memory queuedWithdrawalParams, - IDelegationManager.Withdrawal memory withdrawal, - bytes32 withdrawalRoot - ) = _setUpQueueWithdrawals({ - staker: staker, - withdrawer: withdrawer, - strategies: strategies, - withdrawalAmounts: withdrawalAmounts - }); - - cheats.prank(staker); - delegationManager.queueWithdrawals(queuedWithdrawalParams); - - return (withdrawal, tokens, withdrawalRoot); - } -} - -contract DelegationManagerUnitTests_Initialization_Setters is DelegationManagerUnitTests { - function test_initialization() public { - assertEq( - address(delegationManager.strategyManager()), - address(strategyManagerMock), - "constructor / initializer incorrect, strategyManager set wrong" - ); - assertEq( - address(delegationManager.slasher()), - address(slasherMock), - "constructor / initializer incorrect, slasher set wrong" - ); - assertEq( - address(delegationManager.pauserRegistry()), - address(pauserRegistry), - "constructor / initializer incorrect, pauserRegistry set wrong" - ); - assertEq(delegationManager.owner(), address(this), "constructor / initializer incorrect, owner set wrong"); - assertEq(delegationManager.paused(), 0, "constructor / initializer incorrect, paused status set wrong"); - } - - /// @notice Verifies that the DelegationManager cannot be iniitalized multiple times - function test_initialize_revert_reinitialization() public { - cheats.expectRevert("Initializable: contract is already initialized"); - delegationManager.initialize( - address(this), - pauserRegistry, - 0, - 0, // minWithdrawalDelayBlocks - initializeStrategiesToSetDelayBlocks, - initializeWithdrawalDelayBlocks - ); - } - - function testFuzz_setMinWithdrawalDelayBlocks_revert_notOwner( - address invalidCaller - ) public filterFuzzedAddressInputs(invalidCaller) { - cheats.assume(invalidCaller != delegationManager.owner()); - cheats.prank(invalidCaller); - cheats.expectRevert("Ownable: caller is not the owner"); - delegationManager.setMinWithdrawalDelayBlocks(0); - } - - function testFuzz_setMinWithdrawalDelayBlocks_revert_tooLarge(uint256 newMinWithdrawalDelayBlocks) external { - // filter fuzzed inputs to disallowed amounts - cheats.assume(newMinWithdrawalDelayBlocks > delegationManager.MAX_WITHDRAWAL_DELAY_BLOCKS()); - - // attempt to set the `minWithdrawalDelayBlocks` variable - cheats.expectRevert("DelegationManager._setMinWithdrawalDelayBlocks: _minWithdrawalDelayBlocks cannot be > MAX_WITHDRAWAL_DELAY_BLOCKS"); - delegationManager.setMinWithdrawalDelayBlocks(newMinWithdrawalDelayBlocks); - } - - function testFuzz_initialize_Revert_WhenWithdrawalDelayBlocksTooLarge( - uint256[] memory withdrawalDelayBlocks, - uint256 invalidStrategyIndex - ) public { - // set withdrawalDelayBlocks to be too large - cheats.assume(withdrawalDelayBlocks.length > 0); - uint256 numStrats = withdrawalDelayBlocks.length; - IStrategy[] memory strategiesToSetDelayBlocks = new IStrategy[](numStrats); - for (uint256 i = 0; i < numStrats; i++) { - strategiesToSetDelayBlocks[i] = IStrategy(address(uint160(uint256(keccak256(abi.encode(strategyMock, i)))))); - } - - // set at least one index to be too large for withdrawalDelayBlocks - invalidStrategyIndex = invalidStrategyIndex % numStrats; - withdrawalDelayBlocks[invalidStrategyIndex] = MAX_WITHDRAWAL_DELAY_BLOCKS + 1; - - // Deploy DelegationManager implmentation and proxy - delegationManagerImplementation = new DelegationManager(strategyManagerMock, slasherMock, eigenPodManagerMock); - cheats.expectRevert( - "DelegationManager._setStrategyWithdrawalDelayBlocks: _withdrawalDelayBlocks cannot be > MAX_WITHDRAWAL_DELAY_BLOCKS" - ); - delegationManager = DelegationManager( - address( - new TransparentUpgradeableProxy( - address(delegationManagerImplementation), - address(eigenLayerProxyAdmin), - abi.encodeWithSelector( - DelegationManager.initialize.selector, - address(this), - pauserRegistry, - 0, // 0 is initialPausedStatus - minWithdrawalDelayBlocks, - strategiesToSetDelayBlocks, - withdrawalDelayBlocks - ) - ) - ) - ); - } -} - -contract DelegationManagerUnitTests_RegisterModifyOperator is DelegationManagerUnitTests { - function test_registerAsOperator_revert_paused() public { - // set the pausing flag - cheats.prank(pauser); - delegationManager.pause(2 ** PAUSED_NEW_DELEGATION); - - cheats.expectRevert("Pausable: index is paused"); - delegationManager.registerAsOperator( - IDelegationManager.OperatorDetails({ - __deprecated_earningsReceiver: defaultOperator, - delegationApprover: address(0), - stakerOptOutWindowBlocks: 0 - }), - emptyStringForMetadataURI - ); - } - - // @notice Verifies that someone cannot successfully call `DelegationManager.registerAsOperator(operatorDetails)` again after registering for the first time - function testFuzz_registerAsOperator_revert_cannotRegisterMultipleTimes( - address operator, - IDelegationManager.OperatorDetails memory operatorDetails - ) public filterFuzzedAddressInputs(operator) { - _filterOperatorDetails(operator, operatorDetails); - - // Register once - cheats.startPrank(operator); - delegationManager.registerAsOperator(operatorDetails, emptyStringForMetadataURI); - - // Expect revert when register again - cheats.expectRevert("DelegationManager.registerAsOperator: caller is already actively delegated"); - delegationManager.registerAsOperator(operatorDetails, emptyStringForMetadataURI); - cheats.stopPrank(); - } - - /** - * @notice Verifies that an operator cannot register with `stakerOptOutWindowBlocks` set larger than `MAX_STAKER_OPT_OUT_WINDOW_BLOCKS` - */ - function testFuzz_registerAsOperator_revert_optOutBlocksTooLarge( - IDelegationManager.OperatorDetails memory operatorDetails - ) public { - // filter out *allowed* stakerOptOutWindowBlocks values - cheats.assume(operatorDetails.stakerOptOutWindowBlocks > delegationManager.MAX_STAKER_OPT_OUT_WINDOW_BLOCKS()); - - cheats.prank(defaultOperator); - cheats.expectRevert("DelegationManager._setOperatorDetails: stakerOptOutWindowBlocks cannot be > MAX_STAKER_OPT_OUT_WINDOW_BLOCKS"); - delegationManager.registerAsOperator(operatorDetails, emptyStringForMetadataURI); - } - - /** - * @notice `operator` registers via calling `DelegationManager.registerAsOperator(operatorDetails, 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` & `OperatorDetailsModified` events - * Reverts appropriately if operator was already delegated to someone (including themselves, i.e. they were already an operator) - * @param operator and @param operatorDetails are fuzzed inputs - */ - function testFuzz_registerAsOperator( - address operator, - IDelegationManager.OperatorDetails memory operatorDetails, - string memory metadataURI - ) public filterFuzzedAddressInputs(operator) { - _filterOperatorDetails(operator, operatorDetails); - - cheats.expectEmit(true, true, true, true, address(delegationManager)); - emit OperatorDetailsModified(operator, operatorDetails); - cheats.expectEmit(true, true, true, true, address(delegationManager)); - emit StakerDelegated(operator, operator); - cheats.expectEmit(true, true, true, true, address(delegationManager)); - emit OperatorRegistered(operator, operatorDetails); - cheats.expectEmit(true, true, true, true, address(delegationManager)); - emit OperatorMetadataURIUpdated(operator, metadataURI); - - cheats.prank(operator); - delegationManager.registerAsOperator(operatorDetails, metadataURI); - - // Storage checks - assertEq( - operatorDetails.delegationApprover, - delegationManager.delegationApprover(operator), - "delegationApprover not set correctly" - ); - assertEq( - operatorDetails.stakerOptOutWindowBlocks, - delegationManager.stakerOptOutWindowBlocks(operator), - "stakerOptOutWindowBlocks not set correctly" - ); - assertEq(delegationManager.delegatedTo(operator), operator, "operator not delegated to self"); - } - - // @notice Verifies that a staker who is actively delegated to an operator cannot register as an operator (without first undelegating, at least) - function testFuzz_registerAsOperator_cannotRegisterWhileDelegated( - address staker, - IDelegationManager.OperatorDetails memory operatorDetails - ) public filterFuzzedAddressInputs(staker) { - cheats.assume(staker != defaultOperator); - // Staker becomes an operator, so filter against staker's address - _filterOperatorDetails(staker, operatorDetails); - - // register *this contract* as an operator - _registerOperatorWithBaseDetails(defaultOperator); - - // delegate from the `staker` to the operator - cheats.startPrank(staker); - ISignatureUtils.SignatureWithExpiry memory approverSignatureAndExpiry; - delegationManager.delegateTo(defaultOperator, approverSignatureAndExpiry, emptySalt); - - // expect revert if attempt to register as operator - cheats.expectRevert("DelegationManager.registerAsOperator: caller is already actively delegated"); - delegationManager.registerAsOperator(operatorDetails, emptyStringForMetadataURI); - - cheats.stopPrank(); - } - - /** - * @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 `OperatorDetailsModified` event - * Reverts appropriately if the caller is not an operator - * Reverts if operator tries to decrease their `stakerOptOutWindowBlocks` parameter - * @param initialOperatorDetails and @param modifiedOperatorDetails are fuzzed inputs - */ - function testFuzz_modifyOperatorParameters( - IDelegationManager.OperatorDetails memory initialOperatorDetails, - IDelegationManager.OperatorDetails memory modifiedOperatorDetails - ) public { - _registerOperator(defaultOperator, initialOperatorDetails, emptyStringForMetadataURI); - - cheats.startPrank(defaultOperator); - - // either it fails for trying to set the stakerOptOutWindowBlocks - if (modifiedOperatorDetails.stakerOptOutWindowBlocks > delegationManager.MAX_STAKER_OPT_OUT_WINDOW_BLOCKS()) { - cheats.expectRevert( - "DelegationManager._setOperatorDetails: stakerOptOutWindowBlocks cannot be > MAX_STAKER_OPT_OUT_WINDOW_BLOCKS" - ); - delegationManager.modifyOperatorDetails(modifiedOperatorDetails); - // or the transition is allowed, - } else if ( - modifiedOperatorDetails.stakerOptOutWindowBlocks >= initialOperatorDetails.stakerOptOutWindowBlocks - ) { - cheats.expectEmit(true, true, true, true, address(delegationManager)); - emit OperatorDetailsModified(defaultOperator, modifiedOperatorDetails); - delegationManager.modifyOperatorDetails(modifiedOperatorDetails); - - assertEq( - modifiedOperatorDetails.delegationApprover, - delegationManager.delegationApprover(defaultOperator), - "delegationApprover not set correctly" - ); - assertEq( - modifiedOperatorDetails.stakerOptOutWindowBlocks, - delegationManager.stakerOptOutWindowBlocks(defaultOperator), - "stakerOptOutWindowBlocks not set correctly" - ); - assertEq(delegationManager.delegatedTo(defaultOperator), defaultOperator, "operator not delegated to self"); - // or else the transition is disallowed - } else { - cheats.expectRevert("DelegationManager._setOperatorDetails: stakerOptOutWindowBlocks cannot be decreased"); - delegationManager.modifyOperatorDetails(modifiedOperatorDetails); - } - - cheats.stopPrank(); - } - - // @notice Tests that an address which is not an operator cannot successfully call `updateOperatorMetadataURI`. - function test_updateOperatorMetadataUri_notRegistered() public { - assertFalse(delegationManager.isOperator(defaultOperator), "bad test setup"); - - cheats.prank(defaultOperator); - cheats.expectRevert("DelegationManager.updateOperatorMetadataURI: caller must be an operator"); - delegationManager.updateOperatorMetadataURI(emptyStringForMetadataURI); - } - - /** - * @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_revert_notOperator( - IDelegationManager.OperatorDetails memory operatorDetails - ) public { - cheats.expectRevert("DelegationManager.modifyOperatorDetails: caller must be an operator"); - delegationManager.modifyOperatorDetails(operatorDetails); - } - - // @notice Tests that an operator who calls `updateOperatorMetadataURI` will correctly see an `OperatorMetadataURIUpdated` event emitted with their input - function testFuzz_UpdateOperatorMetadataURI(string memory metadataURI) public { - // register *this contract* as an operator - _registerOperatorWithBaseDetails(defaultOperator); - - // call `updateOperatorMetadataURI` and check for event - cheats.prank(defaultOperator); - cheats.expectEmit(true, true, true, true, address(delegationManager)); - emit OperatorMetadataURIUpdated(defaultOperator, metadataURI); - delegationManager.updateOperatorMetadataURI(metadataURI); - } -} - -contract DelegationManagerUnitTests_delegateTo is DelegationManagerUnitTests { - function test_Revert_WhenPaused() public { - cheats.prank(defaultOperator); - delegationManager.registerAsOperator( - IDelegationManager.OperatorDetails({ - __deprecated_earningsReceiver: defaultOperator, - delegationApprover: address(0), - stakerOptOutWindowBlocks: 0 - }), - emptyStringForMetadataURI - ); - - // set the pausing flag - cheats.prank(pauser); - delegationManager.pause(2 ** PAUSED_NEW_DELEGATION); - - ISignatureUtils.SignatureWithExpiry memory approverSignatureAndExpiry; - cheats.prank(defaultStaker); - cheats.expectRevert("Pausable: index is paused"); - delegationManager.delegateTo(defaultOperator, approverSignatureAndExpiry, emptySalt); - } - - /** - * @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( - address staker, - address operator, - ISignatureUtils.SignatureWithExpiry memory approverSignatureAndExpiry, - bytes32 salt - ) public filterFuzzedAddressInputs(staker) filterFuzzedAddressInputs(operator) { - // filter out input since if the staker tries to delegate again after registering as an operator, we will revert earlier than this test is designed to check - cheats.assume(staker != operator); - - // delegate from the staker to an operator - cheats.assume(operator != address(this)); - _registerOperatorWithBaseDetails(operator); - _delegateToOperatorWhoAcceptsAllStakers(staker, operator); - - // try to delegate again and check that the call reverts - cheats.startPrank(staker); - cheats.expectRevert("DelegationManager.delegateTo: staker is already actively delegated"); - delegationManager.delegateTo(operator, approverSignatureAndExpiry, salt); - cheats.stopPrank(); - } - - // @notice Verifies that `staker` cannot delegate to an unregistered `operator` - function testFuzz_Revert_WhenDelegateToUnregisteredOperator( - address staker, - address operator - ) public filterFuzzedAddressInputs(staker) filterFuzzedAddressInputs(operator) { - assertFalse(delegationManager.isOperator(operator), "incorrect test input?"); - - // try to delegate and check that the call reverts - cheats.startPrank(staker); - cheats.expectRevert("DelegationManager.delegateTo: operator is not registered in EigenLayer"); - ISignatureUtils.SignatureWithExpiry memory approverSignatureAndExpiry; - delegationManager.delegateTo(operator, approverSignatureAndExpiry, emptySalt); - cheats.stopPrank(); - } - - /** - * @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) - * 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_OperatorWhoAcceptsAllStakers_StrategyManagerShares( - address staker, - ISignatureUtils.SignatureWithExpiry memory approverSignatureAndExpiry, - bytes32 salt, - uint256 shares - ) public filterFuzzedAddressInputs(staker) { - // register *this contract* as an operator - // filter inputs, since this will fail when the staker is already registered as an operator - cheats.assume(staker != defaultOperator); - - _registerOperatorWithBaseDetails(defaultOperator); - - // verify that the salt hasn't been used before - assertFalse( - delegationManager.delegationApproverSaltIsSpent( - delegationManager.delegationApprover(defaultOperator), - salt - ), - "salt somehow spent too early?" - ); - // Set staker shares in StrategyManager - IStrategy[] memory strategiesToReturn = new IStrategy[](1); - strategiesToReturn[0] = strategyMock; - uint256[] memory sharesToReturn = new uint256[](1); - sharesToReturn[0] = shares; - strategyManagerMock.setDeposits(staker, strategiesToReturn, sharesToReturn); - uint256 operatorSharesBefore = delegationManager.operatorShares(defaultOperator, strategyMock); - // delegate from the `staker` to the operator - cheats.startPrank(staker); - cheats.expectEmit(true, true, true, true, address(delegationManager)); - emit StakerDelegated(staker, defaultOperator); - cheats.expectEmit(true, true, true, true, address(delegationManager)); - emit OperatorSharesIncreased(defaultOperator, staker, strategyMock, shares); - delegationManager.delegateTo(defaultOperator, approverSignatureAndExpiry, salt); - cheats.stopPrank(); - uint256 operatorSharesAfter = delegationManager.operatorShares(defaultOperator, strategyMock); - - assertEq(operatorSharesBefore + shares, operatorSharesAfter, "operator shares not increased correctly"); - assertTrue(delegationManager.isOperator(defaultOperator), "staker not registered as operator"); - assertEq(delegationManager.delegatedTo(staker), defaultOperator, "staker delegated to the wrong address"); - assertFalse(delegationManager.isOperator(staker), "staker incorrectly registered as operator"); - // verify that the salt is still marked as unused (since it wasn't checked or used) - assertFalse( - delegationManager.delegationApproverSaltIsSpent( - delegationManager.delegationApprover(defaultOperator), - salt - ), - "salt somehow spent too early?" - ); - } - - /** - * @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) - * Properly emits a `StakerDelegated` event - * Staker is correctly delegated after the call (i.e. correct storage update) - * OperatorSharesIncreased event should only be emitted if beaconShares is > 0. Since a staker can have negative shares nothing should happen in that case - */ - function testFuzz_OperatorWhoAcceptsAllStakers_BeaconChainStrategyShares( - address staker, - ISignatureUtils.SignatureWithExpiry memory approverSignatureAndExpiry, - bytes32 salt, - int256 beaconShares - ) public filterFuzzedAddressInputs(staker) { - // register *this contract* as an operator - // filter inputs, since this will fail when the staker is already registered as an operator - cheats.assume(staker != defaultOperator); - - _registerOperatorWithBaseDetails(defaultOperator); - - // verify that the salt hasn't been used before - assertFalse( - delegationManager.delegationApproverSaltIsSpent( - delegationManager.delegationApprover(defaultOperator), - salt - ), - "salt somehow spent too early?" - ); - // Set staker shares in BeaconChainStrategy - eigenPodManagerMock.setPodOwnerShares(staker, beaconShares); - uint256 beaconSharesBefore = delegationManager.operatorShares(staker, beaconChainETHStrategy); - // delegate from the `staker` to the operator - cheats.startPrank(staker); - cheats.expectEmit(true, true, true, true, address(delegationManager)); - emit StakerDelegated(staker, defaultOperator); - if (beaconShares > 0) { - cheats.expectEmit(true, true, true, true, address(delegationManager)); - emit OperatorSharesIncreased(defaultOperator, staker, beaconChainETHStrategy, uint256(beaconShares)); - } - delegationManager.delegateTo(defaultOperator, approverSignatureAndExpiry, salt); - cheats.stopPrank(); - uint256 beaconSharesAfter = delegationManager.operatorShares(defaultOperator, beaconChainETHStrategy); - if (beaconShares <= 0) { - assertEq( - beaconSharesBefore, - beaconSharesAfter, - "operator beaconchain shares should not have increased with negative shares" - ); - } else { - assertEq( - beaconSharesBefore + uint256(beaconShares), - beaconSharesAfter, - "operator beaconchain shares not increased correctly" - ); - } - assertTrue(delegationManager.isOperator(defaultOperator), "staker not registered as operator"); - assertEq(delegationManager.delegatedTo(staker), defaultOperator, "staker delegated to the wrong address"); - assertFalse(delegationManager.isOperator(staker), "staker incorrectly registered as operator"); - // verify that the salt is still marked as unused (since it wasn't checked or used) - assertFalse( - delegationManager.delegationApproverSaltIsSpent( - delegationManager.delegationApprover(defaultOperator), - salt - ), - "salt somehow spent too early?" - ); - } - - /** - * @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. - */ - function testFuzz_OperatorWhoAcceptsAllStakers_BeaconChainAndStrategyManagerShares( - address staker, - ISignatureUtils.SignatureWithExpiry memory approverSignatureAndExpiry, - bytes32 salt, - int256 beaconShares, - uint256 shares - ) public filterFuzzedAddressInputs(staker) { - // register *this contract* as an operator - // filter inputs, since this will fail when the staker is already registered as an operator - cheats.assume(staker != defaultOperator); - - _registerOperatorWithBaseDetails(defaultOperator); - - // verify that the salt hasn't been used before - assertFalse( - delegationManager.delegationApproverSaltIsSpent( - delegationManager.delegationApprover(defaultOperator), - salt - ), - "salt somehow spent too early?" - ); - // Set staker shares in BeaconChainStrategy and StrategyMananger - IStrategy[] memory strategiesToReturn = new IStrategy[](1); - strategiesToReturn[0] = strategyMock; - uint256[] memory sharesToReturn = new uint256[](1); - sharesToReturn[0] = shares; - strategyManagerMock.setDeposits(staker, strategiesToReturn, sharesToReturn); - eigenPodManagerMock.setPodOwnerShares(staker, beaconShares); - uint256 operatorSharesBefore = delegationManager.operatorShares(defaultOperator, strategyMock); - uint256 beaconSharesBefore = delegationManager.operatorShares(staker, beaconChainETHStrategy); - // delegate from the `staker` to the operator - cheats.startPrank(staker); - cheats.expectEmit(true, true, true, true, address(delegationManager)); - emit StakerDelegated(staker, defaultOperator); - cheats.expectEmit(true, true, true, true, address(delegationManager)); - emit OperatorSharesIncreased(defaultOperator, staker, strategyMock, shares); - if (beaconShares > 0) { - cheats.expectEmit(true, true, true, true, address(delegationManager)); - emit OperatorSharesIncreased(defaultOperator, staker, beaconChainETHStrategy, uint256(beaconShares)); - } - delegationManager.delegateTo(defaultOperator, approverSignatureAndExpiry, salt); - cheats.stopPrank(); - uint256 operatorSharesAfter = delegationManager.operatorShares(defaultOperator, strategyMock); - uint256 beaconSharesAfter = delegationManager.operatorShares(defaultOperator, beaconChainETHStrategy); - if (beaconShares <= 0) { - assertEq( - beaconSharesBefore, - beaconSharesAfter, - "operator beaconchain shares should not have increased with negative shares" - ); - } else { - assertEq( - beaconSharesBefore + uint256(beaconShares), - beaconSharesAfter, - "operator beaconchain shares not increased correctly" - ); - } - assertEq(operatorSharesBefore + shares, operatorSharesAfter, "operator shares not increased correctly"); - assertTrue(delegationManager.isOperator(defaultOperator), "staker not registered as operator"); - assertEq(delegationManager.delegatedTo(staker), defaultOperator, "staker delegated to the wrong address"); - assertFalse(delegationManager.isOperator(staker), "staker incorrectly registered as operator"); - // verify that the salt is still marked as unused (since it wasn't checked or used) - assertFalse( - delegationManager.delegationApproverSaltIsSpent( - delegationManager.delegationApprover(defaultOperator), - salt - ), - "salt somehow spent too early?" - ); - } - - /** - * @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( - address staker, - ISignatureUtils.SignatureWithExpiry memory approverSignatureAndExpiry, - bytes32 salt - ) public filterFuzzedAddressInputs(staker) { - // register *this contract* as an operator - // filter inputs, since this will fail when the staker is already registered as an operator - cheats.assume(staker != defaultOperator); - - _registerOperatorWithBaseDetails(defaultOperator); - - // verify that the salt hasn't been used before - assertFalse( - delegationManager.delegationApproverSaltIsSpent( - delegationManager.delegationApprover(defaultOperator), - salt - ), - "salt somehow spent too early?" - ); - - // delegate from the `staker` to the operator - cheats.startPrank(staker); - cheats.expectEmit(true, true, true, true, address(delegationManager)); - emit StakerDelegated(staker, defaultOperator); - delegationManager.delegateTo(defaultOperator, approverSignatureAndExpiry, salt); - cheats.stopPrank(); - - assertTrue(delegationManager.isOperator(defaultOperator), "staker not registered as operator"); - assertEq(delegationManager.delegatedTo(staker), defaultOperator, "staker delegated to the wrong address"); - assertFalse(delegationManager.isOperator(staker), "staker incorrectly registered as operator"); - // verify that the salt is still marked as unused (since it wasn't checked or used) - assertFalse( - delegationManager.delegationApproverSaltIsSpent( - delegationManager.delegationApprover(defaultOperator), - salt - ), - "salt somehow spent too early?" - ); - } - - /** - * @notice Like `testDelegateToOperatorWhoRequiresECDSASignature` but using an invalid expiry on purpose and checking that reversion occurs - */ - function testFuzz_Revert_WhenOperatorWhoRequiresECDSASignature_ExpiredDelegationApproverSignature( - address staker, - bytes32 salt, - uint256 expiry - ) public filterFuzzedAddressInputs(staker) { - // roll to a very late timestamp - skip(type(uint256).max / 2); - // filter to only *invalid* `expiry` values - expiry = bound(expiry, 0, block.timestamp - 1); - // filter inputs, since this will fail when the staker is already registered as an operator - cheats.assume(staker != defaultOperator); - - _registerOperatorWithDelegationApprover(defaultOperator); - - // calculate the delegationSigner's signature - ISignatureUtils.SignatureWithExpiry memory approverSignatureAndExpiry = _getApproverSignature( - delegationSignerPrivateKey, - staker, - defaultOperator, - salt, - expiry - ); - - // delegate from the `staker` to the operator - cheats.startPrank(staker); - cheats.expectRevert("DelegationManager._delegate: approver signature expired"); - delegationManager.delegateTo(defaultOperator, approverSignatureAndExpiry, salt); - cheats.stopPrank(); - } - - /** - * @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( - address staker, - bytes32 salt, - uint256 expiry - ) public filterFuzzedAddressInputs(staker) { - // filter to only valid `expiry` values - cheats.assume(expiry >= block.timestamp); - - // filter inputs, since this will fail when the staker is already registered as an operator - // staker also must not be the delegationApprover so that signature verification process takes place - cheats.assume(staker != defaultOperator); - cheats.assume(staker != defaultApprover); - - _registerOperatorWithDelegationApprover(defaultOperator); - - // verify that the salt hasn't been used before - assertFalse( - delegationManager.delegationApproverSaltIsSpent( - delegationManager.delegationApprover(defaultOperator), - salt - ), - "salt somehow spent too early?" - ); - // calculate the delegationSigner's signature - ISignatureUtils.SignatureWithExpiry memory approverSignatureAndExpiry = _getApproverSignature( - delegationSignerPrivateKey, - staker, - defaultOperator, - salt, - expiry - ); - - // delegate from the `staker` to the operator, undelegate, and then try to delegate again with same approversalt - // to check that call reverts - cheats.startPrank(staker); - delegationManager.delegateTo(defaultOperator, approverSignatureAndExpiry, salt); - assertTrue( - delegationManager.delegationApproverSaltIsSpent( - delegationManager.delegationApprover(defaultOperator), - salt - ), - "salt somehow spent not spent?" - ); - delegationManager.undelegate(staker); - cheats.expectRevert("DelegationManager._delegate: approverSalt already spent"); - delegationManager.delegateTo(defaultOperator, approverSignatureAndExpiry, salt); - cheats.stopPrank(); - } - - /** - * @notice Like `testDelegateToOperatorWhoRequiresECDSASignature` but using an incorrect signature on purpose and checking that reversion occurs - */ - function testFuzz_Revert_WhenOperatorWhoRequiresECDSASignature_WithBadSignature( - address staker, - uint256 expiry - ) public filterFuzzedAddressInputs(staker) { - // filter to only valid `expiry` values - expiry = bound(expiry, block.timestamp + 1, type(uint256).max); - // filter inputs, since this will fail when the staker is already registered as an operator - cheats.assume(staker != defaultOperator && staker != defaultApprover); - - _registerOperatorWithDelegationApprover(defaultOperator); - - // calculate the signature - ISignatureUtils.SignatureWithExpiry memory approverSignatureAndExpiry; - approverSignatureAndExpiry.expiry = expiry; - { - bytes32 digestHash = delegationManager.calculateDelegationApprovalDigestHash( - staker, - defaultOperator, - delegationManager.delegationApprover(defaultOperator), - emptySalt, - expiry - ); - (uint8 v, bytes32 r, bytes32 s) = cheats.sign(delegationSignerPrivateKey, digestHash); - // mess up the signature by flipping v's parity - v = (v == 27 ? 28 : 27); - approverSignatureAndExpiry.signature = abi.encodePacked(r, s, v); - } - - // try to delegate from the `staker` to the operator, and check reversion - cheats.startPrank(staker); - cheats.expectRevert("EIP1271SignatureUtils.checkSignature_EIP1271: signature not from signer"); - delegationManager.delegateTo(defaultOperator, approverSignatureAndExpiry, emptySalt); - cheats.stopPrank(); - } - - /** - * @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( - address staker, - bytes32 salt, - uint256 expiry - ) public filterFuzzedAddressInputs(staker) { - // filter to only valid `expiry` values - cheats.assume(expiry >= block.timestamp); - // filter inputs, since this will fail when the staker is already registered as an operator - cheats.assume(staker != defaultOperator); - - _registerOperatorWithDelegationApprover(defaultOperator); - - // verify that the salt hasn't been used before - assertFalse( - delegationManager.delegationApproverSaltIsSpent( - delegationManager.delegationApprover(defaultOperator), - salt - ), - "salt somehow spent too early?" - ); - // calculate the delegationSigner's signature - ISignatureUtils.SignatureWithExpiry memory approverSignatureAndExpiry = _getApproverSignature( - delegationSignerPrivateKey, - staker, - defaultOperator, - salt, - expiry - ); - - // delegate from the `staker` to the operator - cheats.startPrank(staker); - cheats.expectEmit(true, true, true, true, address(delegationManager)); - emit StakerDelegated(staker, defaultOperator); - delegationManager.delegateTo(defaultOperator, approverSignatureAndExpiry, salt); - cheats.stopPrank(); - - assertFalse(delegationManager.isOperator(staker), "staker incorrectly registered as operator"); - assertEq(delegationManager.delegatedTo(staker), defaultOperator, "staker delegated to the wrong address"); - assertFalse(delegationManager.isOperator(staker), "staker incorrectly registered as operator"); - - if (staker == delegationManager.delegationApprover(defaultOperator)) { - // verify that the salt is still marked as unused (since it wasn't checked or used) - assertFalse( - delegationManager.delegationApproverSaltIsSpent( - delegationManager.delegationApprover(defaultOperator), - salt - ), - "salt somehow spent too incorrectly?" - ); - } else { - // verify that the salt is marked as used - assertTrue( - delegationManager.delegationApproverSaltIsSpent( - delegationManager.delegationApprover(defaultOperator), - salt - ), - "salt somehow spent not spent?" - ); - } - } - - /** - * @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( - address staker, - bytes32 salt, - uint256 expiry, - uint256 shares - ) public filterFuzzedAddressInputs(staker) { - // filter to only valid `expiry` values - cheats.assume(expiry >= block.timestamp); - // filter inputs, since this will fail when the staker is already registered as an operator - cheats.assume(staker != defaultOperator); - - _registerOperatorWithDelegationApprover(defaultOperator); - - // verify that the salt hasn't been used before - assertFalse( - delegationManager.delegationApproverSaltIsSpent( - delegationManager.delegationApprover(defaultOperator), - salt - ), - "salt somehow spent too early?" - ); - // calculate the delegationSigner's signature - ISignatureUtils.SignatureWithExpiry memory approverSignatureAndExpiry = _getApproverSignature( - delegationSignerPrivateKey, - staker, - defaultOperator, - salt, - expiry - ); - - // Set staker shares in StrategyManager - IStrategy[] memory strategiesToReturn = new IStrategy[](1); - strategiesToReturn[0] = strategyMock; - uint256[] memory sharesToReturn = new uint256[](1); - sharesToReturn[0] = shares; - strategyManagerMock.setDeposits(staker, strategiesToReturn, sharesToReturn); - uint256 operatorSharesBefore = delegationManager.operatorShares(defaultOperator, strategyMock); - // delegate from the `staker` to the operator - cheats.startPrank(staker); - cheats.expectEmit(true, true, true, true, address(delegationManager)); - emit StakerDelegated(staker, defaultOperator); - delegationManager.delegateTo(defaultOperator, approverSignatureAndExpiry, salt); - cheats.stopPrank(); - uint256 operatorSharesAfter = delegationManager.operatorShares(defaultOperator, strategyMock); - assertEq(operatorSharesBefore + shares, operatorSharesAfter, "operator shares not increased correctly"); - assertFalse(delegationManager.isOperator(staker), "staker incorrectly registered as operator"); - assertEq(delegationManager.delegatedTo(staker), defaultOperator, "staker delegated to the wrong address"); - assertFalse(delegationManager.isOperator(staker), "staker incorrectly registered as operator"); - - if (staker == delegationManager.delegationApprover(defaultOperator)) { - // verify that the salt is still marked as unused (since it wasn't checked or used) - assertFalse( - delegationManager.delegationApproverSaltIsSpent( - delegationManager.delegationApprover(defaultOperator), - salt - ), - "salt somehow spent too incorrectly?" - ); - } else { - // verify that the salt is marked as used - assertTrue( - delegationManager.delegationApproverSaltIsSpent( - delegationManager.delegationApprover(defaultOperator), - salt - ), - "salt somehow spent not spent?" - ); - } - } - - /** - * @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( - address staker, - bytes32 salt, - uint256 expiry, - int256 beaconShares - ) public filterFuzzedAddressInputs(staker) { - // filter to only valid `expiry` values - cheats.assume(expiry >= block.timestamp); - // filter inputs, since this will fail when the staker is already registered as an operator - cheats.assume(staker != defaultOperator); - - _registerOperatorWithDelegationApprover(defaultOperator); - - // verify that the salt hasn't been used before - assertFalse( - delegationManager.delegationApproverSaltIsSpent( - delegationManager.delegationApprover(defaultOperator), - salt - ), - "salt somehow spent too early?" - ); - // calculate the delegationSigner's signature - ISignatureUtils.SignatureWithExpiry memory approverSignatureAndExpiry = _getApproverSignature( - delegationSignerPrivateKey, - staker, - defaultOperator, - salt, - expiry - ); - - // Set staker shares in BeaconChainStrategy - eigenPodManagerMock.setPodOwnerShares(staker, beaconShares); - uint256 beaconSharesBefore = delegationManager.operatorShares(staker, beaconChainETHStrategy); - // delegate from the `staker` to the operator - cheats.startPrank(staker); - cheats.expectEmit(true, true, true, true, address(delegationManager)); - emit StakerDelegated(staker, defaultOperator); - if (beaconShares > 0) { - cheats.expectEmit(true, true, true, true, address(delegationManager)); - emit OperatorSharesIncreased(defaultOperator, staker, beaconChainETHStrategy, uint256(beaconShares)); - } - delegationManager.delegateTo(defaultOperator, approverSignatureAndExpiry, salt); - cheats.stopPrank(); - uint256 beaconSharesAfter = delegationManager.operatorShares(defaultOperator, beaconChainETHStrategy); - if (beaconShares <= 0) { - assertEq( - beaconSharesBefore, - beaconSharesAfter, - "operator beaconchain shares should not have increased with negative shares" - ); - } else { - assertEq( - beaconSharesBefore + uint256(beaconShares), - beaconSharesAfter, - "operator beaconchain shares not increased correctly" - ); - } - assertFalse(delegationManager.isOperator(staker), "staker incorrectly registered as operator"); - assertEq(delegationManager.delegatedTo(staker), defaultOperator, "staker delegated to the wrong address"); - assertFalse(delegationManager.isOperator(staker), "staker incorrectly registered as operator"); - - if (staker == delegationManager.delegationApprover(defaultOperator)) { - // verify that the salt is still marked as unused (since it wasn't checked or used) - assertFalse( - delegationManager.delegationApproverSaltIsSpent( - delegationManager.delegationApprover(defaultOperator), - salt - ), - "salt somehow spent too incorrectly?" - ); - } else { - // verify that the salt is marked as used - assertTrue( - delegationManager.delegationApproverSaltIsSpent( - delegationManager.delegationApprover(defaultOperator), - salt - ), - "salt somehow spent not spent?" - ); - } - } - - /** - * @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( - address staker, - bytes32 salt, - uint256 expiry, - int256 beaconShares, - uint256 shares - ) public filterFuzzedAddressInputs(staker) { - // filter to only valid `expiry` values - cheats.assume(expiry >= block.timestamp); - - // filter inputs, since this will fail when the staker is already registered as an operator - cheats.assume(staker != defaultOperator); - _registerOperatorWithDelegationApprover(defaultOperator); - - // verify that the salt hasn't been used before - assertFalse( - delegationManager.delegationApproverSaltIsSpent( - delegationManager.delegationApprover(defaultOperator), - salt - ), - "salt somehow spent too early?" - ); - // calculate the delegationSigner's signature - ISignatureUtils.SignatureWithExpiry memory approverSignatureAndExpiry = _getApproverSignature( - delegationSignerPrivateKey, - staker, - defaultOperator, - salt, - expiry - ); - - // Set staker shares in BeaconChainStrategy and StrategyMananger - { - IStrategy[] memory strategiesToReturn = new IStrategy[](1); - strategiesToReturn[0] = strategyMock; - uint256[] memory sharesToReturn = new uint256[](1); - sharesToReturn[0] = shares; - strategyManagerMock.setDeposits(staker, strategiesToReturn, sharesToReturn); - eigenPodManagerMock.setPodOwnerShares(staker, beaconShares); - } - uint256 operatorSharesBefore = delegationManager.operatorShares(defaultOperator, strategyMock); - uint256 beaconSharesBefore = delegationManager.operatorShares(staker, beaconChainETHStrategy); - // delegate from the `staker` to the operator - cheats.startPrank(staker); - cheats.expectEmit(true, true, true, true, address(delegationManager)); - emit StakerDelegated(staker, defaultOperator); - cheats.expectEmit(true, true, true, true, address(delegationManager)); - emit OperatorSharesIncreased(defaultOperator, staker, strategyMock, shares); - if (beaconShares > 0) { - cheats.expectEmit(true, true, true, true, address(delegationManager)); - emit OperatorSharesIncreased(defaultOperator, staker, beaconChainETHStrategy, uint256(beaconShares)); - } - delegationManager.delegateTo(defaultOperator, approverSignatureAndExpiry, salt); - cheats.stopPrank(); - uint256 operatorSharesAfter = delegationManager.operatorShares(defaultOperator, strategyMock); - uint256 beaconSharesAfter = delegationManager.operatorShares(defaultOperator, beaconChainETHStrategy); - if (beaconShares <= 0) { - assertEq( - beaconSharesBefore, - beaconSharesAfter, - "operator beaconchain shares should not have increased with negative shares" - ); - } else { - assertEq( - beaconSharesBefore + uint256(beaconShares), - beaconSharesAfter, - "operator beaconchain shares not increased correctly" - ); - } - assertEq(operatorSharesBefore + shares, operatorSharesAfter, "operator shares not increased correctly"); - assertFalse(delegationManager.isOperator(staker), "staker incorrectly registered as operator"); - assertEq(delegationManager.delegatedTo(staker), defaultOperator, "staker delegated to the wrong address"); - assertFalse(delegationManager.isOperator(staker), "staker incorrectly registered as operator"); - - if (staker == delegationManager.delegationApprover(defaultOperator)) { - // verify that the salt is still marked as unused (since it wasn't checked or used) - assertFalse( - delegationManager.delegationApproverSaltIsSpent( - delegationManager.delegationApprover(defaultOperator), - salt - ), - "salt somehow spent too incorrectly?" - ); - } else { - // verify that the salt is marked as used - assertTrue( - delegationManager.delegationApproverSaltIsSpent( - delegationManager.delegationApprover(defaultOperator), - salt - ), - "salt somehow spent not spent?" - ); - } - } - - /** - * @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( - address staker, - uint256 expiry - ) public filterFuzzedAddressInputs(staker) { - // roll to a very late timestamp - skip(type(uint256).max / 2); - // filter to only *invalid* `expiry` values - expiry = bound(expiry, 0, block.timestamp - 1); - // filter inputs, since this will fail when the staker is already registered as an operator - cheats.assume(staker != defaultOperator); - - _registerOperatorWithDelegationApprover(defaultOperator); - - // create the signature struct - ISignatureUtils.SignatureWithExpiry memory approverSignatureAndExpiry; - approverSignatureAndExpiry.expiry = expiry; - - // try to delegate from the `staker` to the operator, and check reversion - cheats.startPrank(staker); - cheats.expectRevert("DelegationManager._delegate: approver signature expired"); - delegationManager.delegateTo(defaultOperator, approverSignatureAndExpiry, emptySalt); - cheats.stopPrank(); - } - - /** - * @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( - address staker, - bytes32 salt, - uint256 expiry - ) public filterFuzzedAddressInputs(staker) { - // filter to only valid `expiry` values - cheats.assume(expiry >= block.timestamp); - - // register *this contract* as an operator - // filter inputs, since this will fail when the staker is already registered as an operator - ERC1271WalletMock wallet = _registerOperatorWith1271DelegationApprover(defaultOperator); - cheats.assume(staker != address(wallet) && staker != defaultOperator); - - // calculate the delegationSigner's signature - ISignatureUtils.SignatureWithExpiry memory approverSignatureAndExpiry = _getApproverSignature( - delegationSignerPrivateKey, - staker, - defaultOperator, - salt, - expiry - ); - - // delegate from the `staker` to the operator - cheats.startPrank(staker); - cheats.expectEmit(true, true, true, true, address(delegationManager)); - emit StakerDelegated(staker, defaultOperator); - delegationManager.delegateTo(defaultOperator, approverSignatureAndExpiry, salt); - delegationManager.undelegate(staker); - // Reusing same signature should revert with salt already being used - cheats.expectRevert("DelegationManager._delegate: approverSalt already spent"); - delegationManager.delegateTo(defaultOperator, approverSignatureAndExpiry, salt); - cheats.stopPrank(); - } - - /** - * @notice delegateTo test with operator's delegationApprover address set to a contract address that - * is non compliant with EIP1271 - */ - function testFuzz_Revert_WhenOperatorWhoRequiresEIP1271Signature_NonCompliantWallet( - address staker, - uint256 expiry - ) public filterFuzzedAddressInputs(staker) { - // filter to only valid `expiry` values - cheats.assume(expiry >= block.timestamp); - - // register *this contract* as an operator - // filter inputs, since this will fail when the staker is already registered as an operator - cheats.assume(staker != defaultOperator); - - // deploy a ERC1271MaliciousMock contract that will return an incorrect value when called - ERC1271MaliciousMock wallet = new ERC1271MaliciousMock(); - - // filter fuzzed input, since otherwise we can get a flaky failure here. if the caller itself is the 'delegationApprover' - // then we don't even trigger the signature verification call, so we won't get a revert as expected - cheats.assume(staker != address(wallet)); - - IDelegationManager.OperatorDetails memory operatorDetails = IDelegationManager.OperatorDetails({ - __deprecated_earningsReceiver: defaultOperator, - delegationApprover: address(wallet), - stakerOptOutWindowBlocks: 0 - }); - _registerOperator(defaultOperator, operatorDetails, emptyStringForMetadataURI); - - // create the signature struct - ISignatureUtils.SignatureWithExpiry memory approverSignatureAndExpiry; - approverSignatureAndExpiry.expiry = expiry; - - // try to delegate from the `staker` to the operator, and check reversion - cheats.startPrank(staker); - // 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 - cheats.expectRevert(); - delegationManager.delegateTo(defaultOperator, approverSignatureAndExpiry, emptySalt); - cheats.stopPrank(); - } - - /** - * @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( - address staker, - bytes32 salt, - uint256 expiry - ) public filterFuzzedAddressInputs(staker) { - // filter to only valid `expiry` values - cheats.assume(expiry >= block.timestamp); - - // register *this contract* as an operator - // filter inputs, since this will fail when the staker is already registered as an operator - cheats.assume(staker != defaultOperator); - - // deploy a ERC1271WalletMock contract that will return an incorrect value when called - // owner is the 0 address - ERC1271WalletMock wallet = new ERC1271WalletMock(address(1)); - - // filter fuzzed input, since otherwise we can get a flaky failure here. if the caller itself is the 'delegationApprover' - // then we don't even trigger the signature verification call, so we won't get a revert as expected - cheats.assume(staker != address(wallet)); - - IDelegationManager.OperatorDetails memory operatorDetails = IDelegationManager.OperatorDetails({ - __deprecated_earningsReceiver: defaultOperator, - delegationApprover: address(wallet), - stakerOptOutWindowBlocks: 0 - }); - _registerOperator(defaultOperator, operatorDetails, emptyStringForMetadataURI); - - // calculate the delegationSigner's but this is not the correct signature from the wallet contract - // since the wallet owner is address(1) - ISignatureUtils.SignatureWithExpiry memory approverSignatureAndExpiry = _getApproverSignature( - delegationSignerPrivateKey, - staker, - defaultOperator, - salt, - expiry - ); - - // try to delegate from the `staker` to the operator, and check reversion - cheats.startPrank(staker); - // Signature should fail as the wallet will not return EIP1271_MAGICVALUE - cheats.expectRevert("EIP1271SignatureUtils.checkSignature_EIP1271: ERC1271 signature verification failed"); - delegationManager.delegateTo(defaultOperator, approverSignatureAndExpiry, emptySalt); - cheats.stopPrank(); - } - - /** - * @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( - address staker, - bytes32 salt, - uint256 expiry - ) public filterFuzzedAddressInputs(staker) { - // filter to only valid `expiry` values - cheats.assume(expiry >= block.timestamp); - - // register *this contract* as an operator - // filter inputs, since this will fail when the staker is already registered as an operator - cheats.assume(staker != defaultOperator); - - _registerOperatorWith1271DelegationApprover(defaultOperator); - - // verify that the salt hasn't been used before - assertFalse( - delegationManager.delegationApproverSaltIsSpent( - delegationManager.delegationApprover(defaultOperator), - salt - ), - "salt somehow spent too early?" - ); - // calculate the delegationSigner's signature - ISignatureUtils.SignatureWithExpiry memory approverSignatureAndExpiry = _getApproverSignature( - delegationSignerPrivateKey, - staker, - defaultOperator, - salt, - expiry - ); - - // delegate from the `staker` to the operator - cheats.startPrank(staker); - cheats.expectEmit(true, true, true, true, address(delegationManager)); - emit StakerDelegated(staker, defaultOperator); - delegationManager.delegateTo(defaultOperator, approverSignatureAndExpiry, salt); - cheats.stopPrank(); - - assertTrue(delegationManager.isDelegated(staker), "staker not delegated correctly"); - assertEq(delegationManager.delegatedTo(staker), defaultOperator, "staker delegated to the wrong address"); - assertFalse(delegationManager.isOperator(staker), "staker incorrectly registered as operator"); - - // check that the nonce incremented appropriately - if (staker == defaultOperator || staker == delegationManager.delegationApprover(defaultOperator)) { - // verify that the salt is still marked as unused (since it wasn't checked or used) - assertFalse( - delegationManager.delegationApproverSaltIsSpent( - delegationManager.delegationApprover(defaultOperator), - salt - ), - "salt somehow spent too incorrectly?" - ); - } else { - // verify that the salt is marked as used - assertTrue( - delegationManager.delegationApproverSaltIsSpent( - delegationManager.delegationApprover(defaultOperator), - salt - ), - "salt somehow spent not spent?" - ); - } - } -} - -contract DelegationManagerUnitTests_delegateToBySignature is DelegationManagerUnitTests { - function test_revert_paused() public { - cheats.prank(defaultOperator); - delegationManager.registerAsOperator( - IDelegationManager.OperatorDetails({ - __deprecated_earningsReceiver: defaultOperator, - delegationApprover: address(0), - stakerOptOutWindowBlocks: 0 - }), - emptyStringForMetadataURI - ); - - // set the pausing flag - cheats.prank(pauser); - delegationManager.pause(2 ** PAUSED_NEW_DELEGATION); - - uint256 expiry = type(uint256).max; - ISignatureUtils.SignatureWithExpiry memory stakerSignatureAndExpiry = _getStakerSignature( - stakerPrivateKey, - defaultOperator, - expiry - ); - ISignatureUtils.SignatureWithExpiry memory approverSignatureAndExpiry; - cheats.expectRevert("Pausable: index is paused"); - delegationManager.delegateToBySignature( - defaultStaker, - defaultOperator, - stakerSignatureAndExpiry, - approverSignatureAndExpiry, - emptySalt - ); - } - - /// @notice Checks that `DelegationManager.delegateToBySignature` reverts if the staker's signature has expired - function testFuzz_Revert_WhenStakerSignatureExpired( - address staker, - address operator, - uint256 expiry, - bytes memory signature - ) public filterFuzzedAddressInputs(staker) filterFuzzedAddressInputs(operator) { - expiry = bound(expiry, 0, block.timestamp - 1); - cheats.expectRevert("DelegationManager.delegateToBySignature: staker signature expired"); - ISignatureUtils.SignatureWithExpiry memory signatureWithExpiry = ISignatureUtils.SignatureWithExpiry({ - signature: signature, - expiry: expiry - }); - delegationManager.delegateToBySignature(staker, operator, signatureWithExpiry, signatureWithExpiry, emptySalt); - } - - /// @notice Checks that `DelegationManager.delegateToBySignature` reverts if the staker's ECDSA signature verification fails - function test_Revert_EOAStaker_WhenStakerSignatureVerificationFails() public { - address invalidStaker = address(1000); - address caller = address(2000); - uint256 expiry = type(uint256).max; - - _registerOperatorWithBaseDetails(defaultOperator); - - ISignatureUtils.SignatureWithExpiry memory stakerSignatureAndExpiry = _getStakerSignature( - stakerPrivateKey, - defaultOperator, - expiry - ); - - // delegate from the `staker` to the operator, via having the `caller` call `DelegationManager.delegateToBySignature` - // Should revert from invalid signature as staker is not set as the address of signer - cheats.startPrank(caller); - cheats.expectRevert("EIP1271SignatureUtils.checkSignature_EIP1271: signature not from signer"); - // use an empty approver signature input since none is needed / the input is unchecked - ISignatureUtils.SignatureWithExpiry memory approverSignatureAndExpiry; - delegationManager.delegateToBySignature( - invalidStaker, - defaultOperator, - stakerSignatureAndExpiry, - approverSignatureAndExpiry, - emptySalt - ); - cheats.stopPrank(); - } - - /// @notice Checks that `DelegationManager.delegateToBySignature` reverts if the staker's contract signature verification fails - function test_Revert_ERC1271Staker_WhenStakerSignatureVerficationFails() public { - address staker = address(new ERC1271WalletMock(address(1))); - address caller = address(2000); - uint256 expiry = type(uint256).max; - - _registerOperatorWithBaseDetails(defaultOperator); - - ISignatureUtils.SignatureWithExpiry memory stakerSignatureAndExpiry = _getStakerSignature( - stakerPrivateKey, - defaultOperator, - expiry - ); - - // delegate from the `staker` to the operator, via having the `caller` call `DelegationManager.delegateToBySignature` - // Should revert from invalid signature as staker is not set as the address of signer - cheats.startPrank(caller); - cheats.expectRevert("EIP1271SignatureUtils.checkSignature_EIP1271: ERC1271 signature verification failed"); - // use an empty approver signature input since none is needed / the input is unchecked - ISignatureUtils.SignatureWithExpiry memory approverSignatureAndExpiry; - delegationManager.delegateToBySignature( - staker, - defaultOperator, - stakerSignatureAndExpiry, - approverSignatureAndExpiry, - emptySalt - ); - cheats.stopPrank(); - } - - /// @notice Checks that `DelegationManager.delegateToBySignature` reverts when the staker is already delegated - function test_Revert_Staker_WhenAlreadyDelegated() public { - address staker = cheats.addr(stakerPrivateKey); - address caller = address(2000); - uint256 expiry = type(uint256).max; - - _registerOperatorWithBaseDetails(defaultOperator); - - ISignatureUtils.SignatureWithExpiry memory stakerSignatureAndExpiry = _getStakerSignature( - stakerPrivateKey, - defaultOperator, - expiry - ); - - _delegateToOperatorWhoAcceptsAllStakers(staker, defaultOperator); - // delegate from the `staker` to the operator, via having the `caller` call `DelegationManager.delegateToBySignature` - // Should revert as `staker` has already delegated to `operator` - cheats.startPrank(caller); - cheats.expectRevert("DelegationManager.delegateToBySignature: staker is already actively delegated"); - // use an empty approver signature input since none is needed / the input is unchecked - ISignatureUtils.SignatureWithExpiry memory approverSignatureAndExpiry; - delegationManager.delegateToBySignature( - staker, - defaultOperator, - stakerSignatureAndExpiry, - approverSignatureAndExpiry, - emptySalt - ); - cheats.stopPrank(); - } - - /// @notice Checks that `delegateToBySignature` reverts when operator is not registered after successful staker signature verification - function test_Revert_EOAStaker_OperatorNotRegistered() public { - address staker = cheats.addr(stakerPrivateKey); - address caller = address(2000); - uint256 expiry = type(uint256).max; - - ISignatureUtils.SignatureWithExpiry memory stakerSignatureAndExpiry = _getStakerSignature( - stakerPrivateKey, - defaultOperator, - expiry - ); - - // delegate from the `staker` to the operator, via having the `caller` call `DelegationManager.delegateToBySignature` - // Should revert as `operator` is not registered - cheats.startPrank(caller); - cheats.expectRevert("DelegationManager.delegateToBySignature: operator is not registered in EigenLayer"); - // use an empty approver signature input since none is needed / the input is unchecked - ISignatureUtils.SignatureWithExpiry memory approverSignatureAndExpiry; - delegationManager.delegateToBySignature( - staker, - defaultOperator, - stakerSignatureAndExpiry, - approverSignatureAndExpiry, - emptySalt - ); - cheats.stopPrank(); - } - - /** - * @notice Checks that `DelegationManager.delegateToBySignature` reverts if the delegationApprover's signature has expired - * after successful staker signature verification - */ - function testFuzz_Revert_WhenDelegationApproverSignatureExpired( - address caller, - uint256 stakerExpiry, - uint256 delegationApproverExpiry - ) public filterFuzzedAddressInputs(caller) { - cheats.assume(caller != defaultOperator); +// return (queuedWithdrawalParams, withdrawal, withdrawalRoot); +// } + +// /** +// * 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( +// address staker, +// address withdrawer, +// uint256 depositAmount, +// uint256 withdrawalAmount +// ) internal returns (IDelegationManager.Withdrawal memory, IERC20[] memory, bytes32) { +// uint256[] memory depositAmounts = new uint256[](1); +// depositAmounts[0] = depositAmount; +// IStrategy[] memory strategies = _deployAndDepositIntoStrategies(staker, depositAmounts); +// ( +// IDelegationManager.QueuedWithdrawalParams[] memory queuedWithdrawalParams, +// IDelegationManager.Withdrawal memory withdrawal, +// bytes32 withdrawalRoot +// ) = _setUpQueueWithdrawalsSingleStrat({ +// staker: staker, +// withdrawer: withdrawer, +// strategy: strategies[0], +// withdrawalAmount: withdrawalAmount +// }); + +// cheats.prank(staker); +// delegationManager.queueWithdrawals(queuedWithdrawalParams); +// // Set the current deposits to be the depositAmount - withdrawalAmount +// uint256[] memory currentAmounts = new uint256[](1); +// currentAmounts[0] = depositAmount - withdrawalAmount; +// strategyManagerMock.setDeposits(staker, strategies, currentAmounts); + +// IERC20[] memory tokens = new IERC20[](1); +// tokens[0] = strategies[0].underlyingToken(); +// return (withdrawal, tokens, withdrawalRoot); +// } + +// /** +// * 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 _setUpCompleteQueuedWithdrawalBeaconStrat( +// address staker, +// address withdrawer, +// uint256 depositAmount, +// uint256 withdrawalAmount +// ) internal returns (IDelegationManager.Withdrawal memory, IERC20[] memory, bytes32) { +// uint256[] memory depositAmounts = new uint256[](1); +// depositAmounts[0] = depositAmount; +// IStrategy[] memory strategies = new IStrategy[](1); +// strategies[0] = beaconChainETHStrategy; +// ( +// IDelegationManager.QueuedWithdrawalParams[] memory queuedWithdrawalParams, +// IDelegationManager.Withdrawal memory withdrawal, +// bytes32 withdrawalRoot +// ) = _setUpQueueWithdrawalsSingleStrat({ +// staker: staker, +// withdrawer: withdrawer, +// strategy: strategies[0], +// withdrawalAmount: withdrawalAmount +// }); + +// cheats.prank(staker); +// delegationManager.queueWithdrawals(queuedWithdrawalParams); +// // Set the current deposits to be the depositAmount - withdrawalAmount +// uint256[] memory currentAmounts = new uint256[](1); +// currentAmounts[0] = depositAmount - withdrawalAmount; +// strategyManagerMock.setDeposits(staker, strategies, currentAmounts); + +// IERC20[] memory tokens; +// // tokens[0] = strategies[0].underlyingToken(); +// return (withdrawal, tokens, withdrawalRoot); +// } + +// /** +// * 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( +// address staker, +// address withdrawer, +// uint256[] memory depositAmounts, +// uint256[] memory withdrawalAmounts +// ) internal returns (IDelegationManager.Withdrawal memory, IERC20[] memory, bytes32) { +// IStrategy[] memory strategies = _deployAndDepositIntoStrategies(staker, depositAmounts); + +// IERC20[] memory tokens = new IERC20[](strategies.length); +// for (uint256 i = 0; i < strategies.length; i++) { +// tokens[i] = strategies[i].underlyingToken(); +// } + +// ( +// IDelegationManager.QueuedWithdrawalParams[] memory queuedWithdrawalParams, +// IDelegationManager.Withdrawal memory withdrawal, +// bytes32 withdrawalRoot +// ) = _setUpQueueWithdrawals({ +// staker: staker, +// withdrawer: withdrawer, +// strategies: strategies, +// withdrawalAmounts: withdrawalAmounts +// }); + +// cheats.prank(staker); +// delegationManager.queueWithdrawals(queuedWithdrawalParams); + +// return (withdrawal, tokens, withdrawalRoot); +// } +// } + +// contract DelegationManagerUnitTests_Initialization_Setters is DelegationManagerUnitTests { +// function test_initialization() public { +// assertEq( +// address(delegationManager.strategyManager()), +// address(strategyManagerMock), +// "constructor / initializer incorrect, strategyManager set wrong" +// ); +// assertEq( +// address(delegationManager.slasher()), +// address(slasherMock), +// "constructor / initializer incorrect, slasher set wrong" +// ); +// assertEq( +// address(delegationManager.pauserRegistry()), +// address(pauserRegistry), +// "constructor / initializer incorrect, pauserRegistry set wrong" +// ); +// assertEq(delegationManager.owner(), address(this), "constructor / initializer incorrect, owner set wrong"); +// assertEq(delegationManager.paused(), 0, "constructor / initializer incorrect, paused status set wrong"); +// } + +// /// @notice Verifies that the DelegationManager cannot be iniitalized multiple times +// function test_initialize_revert_reinitialization() public { +// cheats.expectRevert("Initializable: contract is already initialized"); +// delegationManager.initialize( +// address(this), +// pauserRegistry, +// 0, +// 0, // minWithdrawalDelayBlocks +// initializeStrategiesToSetDelayBlocks, +// initializeWithdrawalDelayBlocks +// ); +// } + +// function testFuzz_setMinWithdrawalDelayBlocks_revert_notOwner( +// address invalidCaller +// ) public filterFuzzedAddressInputs(invalidCaller) { +// cheats.assume(invalidCaller != delegationManager.owner()); +// cheats.prank(invalidCaller); +// cheats.expectRevert("Ownable: caller is not the owner"); +// delegationManager.setMinWithdrawalDelayBlocks(0); +// } + +// function testFuzz_setMinWithdrawalDelayBlocks_revert_tooLarge(uint256 newMinWithdrawalDelayBlocks) external { +// // filter fuzzed inputs to disallowed amounts +// cheats.assume(newMinWithdrawalDelayBlocks > delegationManager.MAX_WITHDRAWAL_DELAY_BLOCKS()); + +// // attempt to set the `minWithdrawalDelayBlocks` variable +// cheats.expectRevert("DelegationManager._setMinWithdrawalDelayBlocks: _minWithdrawalDelayBlocks cannot be > MAX_WITHDRAWAL_DELAY_BLOCKS"); +// delegationManager.setMinWithdrawalDelayBlocks(newMinWithdrawalDelayBlocks); +// } + +// function testFuzz_initialize_Revert_WhenWithdrawalDelayBlocksTooLarge( +// uint256[] memory withdrawalDelayBlocks, +// uint256 invalidStrategyIndex +// ) public { +// // set withdrawalDelayBlocks to be too large +// cheats.assume(withdrawalDelayBlocks.length > 0); +// uint256 numStrats = withdrawalDelayBlocks.length; +// IStrategy[] memory strategiesToSetDelayBlocks = new IStrategy[](numStrats); +// for (uint256 i = 0; i < numStrats; i++) { +// strategiesToSetDelayBlocks[i] = IStrategy(address(uint160(uint256(keccak256(abi.encode(strategyMock, i)))))); +// } + +// // set at least one index to be too large for withdrawalDelayBlocks +// invalidStrategyIndex = invalidStrategyIndex % numStrats; +// withdrawalDelayBlocks[invalidStrategyIndex] = MAX_WITHDRAWAL_DELAY_BLOCKS + 1; + +// // Deploy DelegationManager implmentation and proxy +// delegationManagerImplementation = new DelegationManager(strategyManagerMock, slasherMock, eigenPodManagerMock); +// cheats.expectRevert( +// "DelegationManager._setStrategyWithdrawalDelayBlocks: _withdrawalDelayBlocks cannot be > MAX_WITHDRAWAL_DELAY_BLOCKS" +// ); +// delegationManager = DelegationManager( +// address( +// new TransparentUpgradeableProxy( +// address(delegationManagerImplementation), +// address(eigenLayerProxyAdmin), +// abi.encodeWithSelector( +// DelegationManager.initialize.selector, +// address(this), +// pauserRegistry, +// 0, // 0 is initialPausedStatus +// minWithdrawalDelayBlocks, +// strategiesToSetDelayBlocks, +// withdrawalDelayBlocks +// ) +// ) +// ) +// ); +// } +// } + +// contract DelegationManagerUnitTests_RegisterModifyOperator is DelegationManagerUnitTests { +// function test_registerAsOperator_revert_paused() public { +// // set the pausing flag +// cheats.prank(pauser); +// delegationManager.pause(2 ** PAUSED_NEW_DELEGATION); + +// cheats.expectRevert("Pausable: index is paused"); +// delegationManager.registerAsOperator( +// IDelegationManager.OperatorDetails({ +// __deprecated_earningsReceiver: defaultOperator, +// delegationApprover: address(0), +// stakerOptOutWindowBlocks: 0 +// }), +// emptyStringForMetadataURI +// ); +// } + +// // @notice Verifies that someone cannot successfully call `DelegationManager.registerAsOperator(operatorDetails)` again after registering for the first time +// function testFuzz_registerAsOperator_revert_cannotRegisterMultipleTimes( +// address operator, +// IDelegationManager.OperatorDetails memory operatorDetails +// ) public filterFuzzedAddressInputs(operator) { +// _filterOperatorDetails(operator, operatorDetails); + +// // Register once +// cheats.startPrank(operator); +// delegationManager.registerAsOperator(operatorDetails, emptyStringForMetadataURI); + +// // Expect revert when register again +// cheats.expectRevert("DelegationManager.registerAsOperator: caller is already actively delegated"); +// delegationManager.registerAsOperator(operatorDetails, emptyStringForMetadataURI); +// cheats.stopPrank(); +// } + +// /** +// * @notice Verifies that an operator cannot register with `stakerOptOutWindowBlocks` set larger than `MAX_STAKER_OPT_OUT_WINDOW_BLOCKS` +// */ +// function testFuzz_registerAsOperator_revert_optOutBlocksTooLarge( +// IDelegationManager.OperatorDetails memory operatorDetails +// ) public { +// // filter out *allowed* stakerOptOutWindowBlocks values +// cheats.assume(operatorDetails.stakerOptOutWindowBlocks > delegationManager.MAX_STAKER_OPT_OUT_WINDOW_BLOCKS()); + +// cheats.prank(defaultOperator); +// cheats.expectRevert("DelegationManager._setOperatorDetails: stakerOptOutWindowBlocks cannot be > MAX_STAKER_OPT_OUT_WINDOW_BLOCKS"); +// delegationManager.registerAsOperator(operatorDetails, emptyStringForMetadataURI); +// } + +// /** +// * @notice `operator` registers via calling `DelegationManager.registerAsOperator(operatorDetails, 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` & `OperatorDetailsModified` events +// * Reverts appropriately if operator was already delegated to someone (including themselves, i.e. they were already an operator) +// * @param operator and @param operatorDetails are fuzzed inputs +// */ +// function testFuzz_registerAsOperator( +// address operator, +// IDelegationManager.OperatorDetails memory operatorDetails, +// string memory metadataURI +// ) public filterFuzzedAddressInputs(operator) { +// _filterOperatorDetails(operator, operatorDetails); + +// cheats.expectEmit(true, true, true, true, address(delegationManager)); +// emit OperatorDetailsModified(operator, operatorDetails); +// cheats.expectEmit(true, true, true, true, address(delegationManager)); +// emit StakerDelegated(operator, operator); +// cheats.expectEmit(true, true, true, true, address(delegationManager)); +// emit OperatorRegistered(operator, operatorDetails); +// cheats.expectEmit(true, true, true, true, address(delegationManager)); +// emit OperatorMetadataURIUpdated(operator, metadataURI); + +// cheats.prank(operator); +// delegationManager.registerAsOperator(operatorDetails, metadataURI); + +// // Storage checks +// assertEq( +// operatorDetails.delegationApprover, +// delegationManager.delegationApprover(operator), +// "delegationApprover not set correctly" +// ); +// assertEq( +// operatorDetails.stakerOptOutWindowBlocks, +// delegationManager.stakerOptOutWindowBlocks(operator), +// "stakerOptOutWindowBlocks not set correctly" +// ); +// assertEq(delegationManager.delegatedTo(operator), operator, "operator not delegated to self"); +// } + +// // @notice Verifies that a staker who is actively delegated to an operator cannot register as an operator (without first undelegating, at least) +// function testFuzz_registerAsOperator_cannotRegisterWhileDelegated( +// address staker, +// IDelegationManager.OperatorDetails memory operatorDetails +// ) public filterFuzzedAddressInputs(staker) { +// cheats.assume(staker != defaultOperator); +// // Staker becomes an operator, so filter against staker's address +// _filterOperatorDetails(staker, operatorDetails); + +// // register *this contract* as an operator +// _registerOperatorWithBaseDetails(defaultOperator); + +// // delegate from the `staker` to the operator +// cheats.startPrank(staker); +// ISignatureUtils.SignatureWithExpiry memory approverSignatureAndExpiry; +// delegationManager.delegateTo(defaultOperator, approverSignatureAndExpiry, emptySalt); + +// // expect revert if attempt to register as operator +// cheats.expectRevert("DelegationManager.registerAsOperator: caller is already actively delegated"); +// delegationManager.registerAsOperator(operatorDetails, emptyStringForMetadataURI); + +// cheats.stopPrank(); +// } + +// /** +// * @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 `OperatorDetailsModified` event +// * Reverts appropriately if the caller is not an operator +// * Reverts if operator tries to decrease their `stakerOptOutWindowBlocks` parameter +// * @param initialOperatorDetails and @param modifiedOperatorDetails are fuzzed inputs +// */ +// function testFuzz_modifyOperatorParameters( +// IDelegationManager.OperatorDetails memory initialOperatorDetails, +// IDelegationManager.OperatorDetails memory modifiedOperatorDetails +// ) public { +// _registerOperator(defaultOperator, initialOperatorDetails, emptyStringForMetadataURI); + +// cheats.startPrank(defaultOperator); + +// // either it fails for trying to set the stakerOptOutWindowBlocks +// if (modifiedOperatorDetails.stakerOptOutWindowBlocks > delegationManager.MAX_STAKER_OPT_OUT_WINDOW_BLOCKS()) { +// cheats.expectRevert( +// "DelegationManager._setOperatorDetails: stakerOptOutWindowBlocks cannot be > MAX_STAKER_OPT_OUT_WINDOW_BLOCKS" +// ); +// delegationManager.modifyOperatorDetails(modifiedOperatorDetails); +// // or the transition is allowed, +// } else if ( +// modifiedOperatorDetails.stakerOptOutWindowBlocks >= initialOperatorDetails.stakerOptOutWindowBlocks +// ) { +// cheats.expectEmit(true, true, true, true, address(delegationManager)); +// emit OperatorDetailsModified(defaultOperator, modifiedOperatorDetails); +// delegationManager.modifyOperatorDetails(modifiedOperatorDetails); + +// assertEq( +// modifiedOperatorDetails.delegationApprover, +// delegationManager.delegationApprover(defaultOperator), +// "delegationApprover not set correctly" +// ); +// assertEq( +// modifiedOperatorDetails.stakerOptOutWindowBlocks, +// delegationManager.stakerOptOutWindowBlocks(defaultOperator), +// "stakerOptOutWindowBlocks not set correctly" +// ); +// assertEq(delegationManager.delegatedTo(defaultOperator), defaultOperator, "operator not delegated to self"); +// // or else the transition is disallowed +// } else { +// cheats.expectRevert("DelegationManager._setOperatorDetails: stakerOptOutWindowBlocks cannot be decreased"); +// delegationManager.modifyOperatorDetails(modifiedOperatorDetails); +// } + +// cheats.stopPrank(); +// } + +// // @notice Tests that an address which is not an operator cannot successfully call `updateOperatorMetadataURI`. +// function test_updateOperatorMetadataUri_notRegistered() public { +// assertFalse(delegationManager.isOperator(defaultOperator), "bad test setup"); + +// cheats.prank(defaultOperator); +// cheats.expectRevert("DelegationManager.updateOperatorMetadataURI: caller must be an operator"); +// delegationManager.updateOperatorMetadataURI(emptyStringForMetadataURI); +// } + +// /** +// * @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_revert_notOperator( +// IDelegationManager.OperatorDetails memory operatorDetails +// ) public { +// cheats.expectRevert("DelegationManager.modifyOperatorDetails: caller must be an operator"); +// delegationManager.modifyOperatorDetails(operatorDetails); +// } + +// // @notice Tests that an operator who calls `updateOperatorMetadataURI` will correctly see an `OperatorMetadataURIUpdated` event emitted with their input +// function testFuzz_UpdateOperatorMetadataURI(string memory metadataURI) public { +// // register *this contract* as an operator +// _registerOperatorWithBaseDetails(defaultOperator); + +// // call `updateOperatorMetadataURI` and check for event +// cheats.prank(defaultOperator); +// cheats.expectEmit(true, true, true, true, address(delegationManager)); +// emit OperatorMetadataURIUpdated(defaultOperator, metadataURI); +// delegationManager.updateOperatorMetadataURI(metadataURI); +// } +// } + +// contract DelegationManagerUnitTests_delegateTo is DelegationManagerUnitTests { +// function test_Revert_WhenPaused() public { +// cheats.prank(defaultOperator); +// delegationManager.registerAsOperator( +// IDelegationManager.OperatorDetails({ +// __deprecated_earningsReceiver: defaultOperator, +// delegationApprover: address(0), +// stakerOptOutWindowBlocks: 0 +// }), +// emptyStringForMetadataURI +// ); + +// // set the pausing flag +// cheats.prank(pauser); +// delegationManager.pause(2 ** PAUSED_NEW_DELEGATION); + +// ISignatureUtils.SignatureWithExpiry memory approverSignatureAndExpiry; +// cheats.prank(defaultStaker); +// cheats.expectRevert("Pausable: index is paused"); +// delegationManager.delegateTo(defaultOperator, approverSignatureAndExpiry, emptySalt); +// } + +// /** +// * @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( +// address staker, +// address operator, +// ISignatureUtils.SignatureWithExpiry memory approverSignatureAndExpiry, +// bytes32 salt +// ) public filterFuzzedAddressInputs(staker) filterFuzzedAddressInputs(operator) { +// // filter out input since if the staker tries to delegate again after registering as an operator, we will revert earlier than this test is designed to check +// cheats.assume(staker != operator); + +// // delegate from the staker to an operator +// cheats.assume(operator != address(this)); +// _registerOperatorWithBaseDetails(operator); +// _delegateToOperatorWhoAcceptsAllStakers(staker, operator); + +// // try to delegate again and check that the call reverts +// cheats.startPrank(staker); +// cheats.expectRevert("DelegationManager.delegateTo: staker is already actively delegated"); +// delegationManager.delegateTo(operator, approverSignatureAndExpiry, salt); +// cheats.stopPrank(); +// } + +// // @notice Verifies that `staker` cannot delegate to an unregistered `operator` +// function testFuzz_Revert_WhenDelegateToUnregisteredOperator( +// address staker, +// address operator +// ) public filterFuzzedAddressInputs(staker) filterFuzzedAddressInputs(operator) { +// assertFalse(delegationManager.isOperator(operator), "incorrect test input?"); + +// // try to delegate and check that the call reverts +// cheats.startPrank(staker); +// cheats.expectRevert("DelegationManager.delegateTo: operator is not registered in EigenLayer"); +// ISignatureUtils.SignatureWithExpiry memory approverSignatureAndExpiry; +// delegationManager.delegateTo(operator, approverSignatureAndExpiry, emptySalt); +// cheats.stopPrank(); +// } + +// /** +// * @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) +// * 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_OperatorWhoAcceptsAllStakers_StrategyManagerShares( +// address staker, +// ISignatureUtils.SignatureWithExpiry memory approverSignatureAndExpiry, +// bytes32 salt, +// uint256 shares +// ) public filterFuzzedAddressInputs(staker) { +// // register *this contract* as an operator +// // filter inputs, since this will fail when the staker is already registered as an operator +// cheats.assume(staker != defaultOperator); + +// _registerOperatorWithBaseDetails(defaultOperator); + +// // verify that the salt hasn't been used before +// assertFalse( +// delegationManager.delegationApproverSaltIsSpent( +// delegationManager.delegationApprover(defaultOperator), +// salt +// ), +// "salt somehow spent too early?" +// ); +// // Set staker shares in StrategyManager +// IStrategy[] memory strategiesToReturn = new IStrategy[](1); +// strategiesToReturn[0] = strategyMock; +// uint256[] memory sharesToReturn = new uint256[](1); +// sharesToReturn[0] = shares; +// strategyManagerMock.setDeposits(staker, strategiesToReturn, sharesToReturn); +// uint256 operatorSharesBefore = delegationManager.operatorShares(defaultOperator, strategyMock); +// // delegate from the `staker` to the operator +// cheats.startPrank(staker); +// cheats.expectEmit(true, true, true, true, address(delegationManager)); +// emit StakerDelegated(staker, defaultOperator); +// cheats.expectEmit(true, true, true, true, address(delegationManager)); +// emit OperatorSharesIncreased(defaultOperator, staker, strategyMock, shares); +// delegationManager.delegateTo(defaultOperator, approverSignatureAndExpiry, salt); +// cheats.stopPrank(); +// uint256 operatorSharesAfter = delegationManager.operatorShares(defaultOperator, strategyMock); + +// assertEq(operatorSharesBefore + shares, operatorSharesAfter, "operator shares not increased correctly"); +// assertTrue(delegationManager.isOperator(defaultOperator), "staker not registered as operator"); +// assertEq(delegationManager.delegatedTo(staker), defaultOperator, "staker delegated to the wrong address"); +// assertFalse(delegationManager.isOperator(staker), "staker incorrectly registered as operator"); +// // verify that the salt is still marked as unused (since it wasn't checked or used) +// assertFalse( +// delegationManager.delegationApproverSaltIsSpent( +// delegationManager.delegationApprover(defaultOperator), +// salt +// ), +// "salt somehow spent too early?" +// ); +// } + +// /** +// * @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) +// * Properly emits a `StakerDelegated` event +// * Staker is correctly delegated after the call (i.e. correct storage update) +// * OperatorSharesIncreased event should only be emitted if beaconShares is > 0. Since a staker can have negative shares nothing should happen in that case +// */ +// function testFuzz_OperatorWhoAcceptsAllStakers_BeaconChainStrategyShares( +// address staker, +// ISignatureUtils.SignatureWithExpiry memory approverSignatureAndExpiry, +// bytes32 salt, +// int256 beaconShares +// ) public filterFuzzedAddressInputs(staker) { +// // register *this contract* as an operator +// // filter inputs, since this will fail when the staker is already registered as an operator +// cheats.assume(staker != defaultOperator); + +// _registerOperatorWithBaseDetails(defaultOperator); + +// // verify that the salt hasn't been used before +// assertFalse( +// delegationManager.delegationApproverSaltIsSpent( +// delegationManager.delegationApprover(defaultOperator), +// salt +// ), +// "salt somehow spent too early?" +// ); +// // Set staker shares in BeaconChainStrategy +// eigenPodManagerMock.setPodOwnerShares(staker, beaconShares); +// uint256 beaconSharesBefore = delegationManager.operatorShares(staker, beaconChainETHStrategy); +// // delegate from the `staker` to the operator +// cheats.startPrank(staker); +// cheats.expectEmit(true, true, true, true, address(delegationManager)); +// emit StakerDelegated(staker, defaultOperator); +// if (beaconShares > 0) { +// cheats.expectEmit(true, true, true, true, address(delegationManager)); +// emit OperatorSharesIncreased(defaultOperator, staker, beaconChainETHStrategy, uint256(beaconShares)); +// } +// delegationManager.delegateTo(defaultOperator, approverSignatureAndExpiry, salt); +// cheats.stopPrank(); +// uint256 beaconSharesAfter = delegationManager.operatorShares(defaultOperator, beaconChainETHStrategy); +// if (beaconShares <= 0) { +// assertEq( +// beaconSharesBefore, +// beaconSharesAfter, +// "operator beaconchain shares should not have increased with negative shares" +// ); +// } else { +// assertEq( +// beaconSharesBefore + uint256(beaconShares), +// beaconSharesAfter, +// "operator beaconchain shares not increased correctly" +// ); +// } +// assertTrue(delegationManager.isOperator(defaultOperator), "staker not registered as operator"); +// assertEq(delegationManager.delegatedTo(staker), defaultOperator, "staker delegated to the wrong address"); +// assertFalse(delegationManager.isOperator(staker), "staker incorrectly registered as operator"); +// // verify that the salt is still marked as unused (since it wasn't checked or used) +// assertFalse( +// delegationManager.delegationApproverSaltIsSpent( +// delegationManager.delegationApprover(defaultOperator), +// salt +// ), +// "salt somehow spent too early?" +// ); +// } + +// /** +// * @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. +// */ +// function testFuzz_OperatorWhoAcceptsAllStakers_BeaconChainAndStrategyManagerShares( +// address staker, +// ISignatureUtils.SignatureWithExpiry memory approverSignatureAndExpiry, +// bytes32 salt, +// int256 beaconShares, +// uint256 shares +// ) public filterFuzzedAddressInputs(staker) { +// // register *this contract* as an operator +// // filter inputs, since this will fail when the staker is already registered as an operator +// cheats.assume(staker != defaultOperator); + +// _registerOperatorWithBaseDetails(defaultOperator); + +// // verify that the salt hasn't been used before +// assertFalse( +// delegationManager.delegationApproverSaltIsSpent( +// delegationManager.delegationApprover(defaultOperator), +// salt +// ), +// "salt somehow spent too early?" +// ); +// // Set staker shares in BeaconChainStrategy and StrategyMananger +// IStrategy[] memory strategiesToReturn = new IStrategy[](1); +// strategiesToReturn[0] = strategyMock; +// uint256[] memory sharesToReturn = new uint256[](1); +// sharesToReturn[0] = shares; +// strategyManagerMock.setDeposits(staker, strategiesToReturn, sharesToReturn); +// eigenPodManagerMock.setPodOwnerShares(staker, beaconShares); +// uint256 operatorSharesBefore = delegationManager.operatorShares(defaultOperator, strategyMock); +// uint256 beaconSharesBefore = delegationManager.operatorShares(staker, beaconChainETHStrategy); +// // delegate from the `staker` to the operator +// cheats.startPrank(staker); +// cheats.expectEmit(true, true, true, true, address(delegationManager)); +// emit StakerDelegated(staker, defaultOperator); +// cheats.expectEmit(true, true, true, true, address(delegationManager)); +// emit OperatorSharesIncreased(defaultOperator, staker, strategyMock, shares); +// if (beaconShares > 0) { +// cheats.expectEmit(true, true, true, true, address(delegationManager)); +// emit OperatorSharesIncreased(defaultOperator, staker, beaconChainETHStrategy, uint256(beaconShares)); +// } +// delegationManager.delegateTo(defaultOperator, approverSignatureAndExpiry, salt); +// cheats.stopPrank(); +// uint256 operatorSharesAfter = delegationManager.operatorShares(defaultOperator, strategyMock); +// uint256 beaconSharesAfter = delegationManager.operatorShares(defaultOperator, beaconChainETHStrategy); +// if (beaconShares <= 0) { +// assertEq( +// beaconSharesBefore, +// beaconSharesAfter, +// "operator beaconchain shares should not have increased with negative shares" +// ); +// } else { +// assertEq( +// beaconSharesBefore + uint256(beaconShares), +// beaconSharesAfter, +// "operator beaconchain shares not increased correctly" +// ); +// } +// assertEq(operatorSharesBefore + shares, operatorSharesAfter, "operator shares not increased correctly"); +// assertTrue(delegationManager.isOperator(defaultOperator), "staker not registered as operator"); +// assertEq(delegationManager.delegatedTo(staker), defaultOperator, "staker delegated to the wrong address"); +// assertFalse(delegationManager.isOperator(staker), "staker incorrectly registered as operator"); +// // verify that the salt is still marked as unused (since it wasn't checked or used) +// assertFalse( +// delegationManager.delegationApproverSaltIsSpent( +// delegationManager.delegationApprover(defaultOperator), +// salt +// ), +// "salt somehow spent too early?" +// ); +// } + +// /** +// * @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( +// address staker, +// ISignatureUtils.SignatureWithExpiry memory approverSignatureAndExpiry, +// bytes32 salt +// ) public filterFuzzedAddressInputs(staker) { +// // register *this contract* as an operator +// // filter inputs, since this will fail when the staker is already registered as an operator +// cheats.assume(staker != defaultOperator); + +// _registerOperatorWithBaseDetails(defaultOperator); + +// // verify that the salt hasn't been used before +// assertFalse( +// delegationManager.delegationApproverSaltIsSpent( +// delegationManager.delegationApprover(defaultOperator), +// salt +// ), +// "salt somehow spent too early?" +// ); + +// // delegate from the `staker` to the operator +// cheats.startPrank(staker); +// cheats.expectEmit(true, true, true, true, address(delegationManager)); +// emit StakerDelegated(staker, defaultOperator); +// delegationManager.delegateTo(defaultOperator, approverSignatureAndExpiry, salt); +// cheats.stopPrank(); + +// assertTrue(delegationManager.isOperator(defaultOperator), "staker not registered as operator"); +// assertEq(delegationManager.delegatedTo(staker), defaultOperator, "staker delegated to the wrong address"); +// assertFalse(delegationManager.isOperator(staker), "staker incorrectly registered as operator"); +// // verify that the salt is still marked as unused (since it wasn't checked or used) +// assertFalse( +// delegationManager.delegationApproverSaltIsSpent( +// delegationManager.delegationApprover(defaultOperator), +// salt +// ), +// "salt somehow spent too early?" +// ); +// } + +// /** +// * @notice Like `testDelegateToOperatorWhoRequiresECDSASignature` but using an invalid expiry on purpose and checking that reversion occurs +// */ +// function testFuzz_Revert_WhenOperatorWhoRequiresECDSASignature_ExpiredDelegationApproverSignature( +// address staker, +// bytes32 salt, +// uint256 expiry +// ) public filterFuzzedAddressInputs(staker) { +// // roll to a very late timestamp +// skip(type(uint256).max / 2); +// // filter to only *invalid* `expiry` values +// expiry = bound(expiry, 0, block.timestamp - 1); +// // filter inputs, since this will fail when the staker is already registered as an operator +// cheats.assume(staker != defaultOperator); + +// _registerOperatorWithDelegationApprover(defaultOperator); + +// // calculate the delegationSigner's signature +// ISignatureUtils.SignatureWithExpiry memory approverSignatureAndExpiry = _getApproverSignature( +// delegationSignerPrivateKey, +// staker, +// defaultOperator, +// salt, +// expiry +// ); + +// // delegate from the `staker` to the operator +// cheats.startPrank(staker); +// cheats.expectRevert("DelegationManager._delegate: approver signature expired"); +// delegationManager.delegateTo(defaultOperator, approverSignatureAndExpiry, salt); +// cheats.stopPrank(); +// } + +// /** +// * @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( +// address staker, +// bytes32 salt, +// uint256 expiry +// ) public filterFuzzedAddressInputs(staker) { +// // filter to only valid `expiry` values +// cheats.assume(expiry >= block.timestamp); + +// // filter inputs, since this will fail when the staker is already registered as an operator +// // staker also must not be the delegationApprover so that signature verification process takes place +// cheats.assume(staker != defaultOperator); +// cheats.assume(staker != defaultApprover); + +// _registerOperatorWithDelegationApprover(defaultOperator); + +// // verify that the salt hasn't been used before +// assertFalse( +// delegationManager.delegationApproverSaltIsSpent( +// delegationManager.delegationApprover(defaultOperator), +// salt +// ), +// "salt somehow spent too early?" +// ); +// // calculate the delegationSigner's signature +// ISignatureUtils.SignatureWithExpiry memory approverSignatureAndExpiry = _getApproverSignature( +// delegationSignerPrivateKey, +// staker, +// defaultOperator, +// salt, +// expiry +// ); + +// // delegate from the `staker` to the operator, undelegate, and then try to delegate again with same approversalt +// // to check that call reverts +// cheats.startPrank(staker); +// delegationManager.delegateTo(defaultOperator, approverSignatureAndExpiry, salt); +// assertTrue( +// delegationManager.delegationApproverSaltIsSpent( +// delegationManager.delegationApprover(defaultOperator), +// salt +// ), +// "salt somehow spent not spent?" +// ); +// delegationManager.undelegate(staker); +// cheats.expectRevert("DelegationManager._delegate: approverSalt already spent"); +// delegationManager.delegateTo(defaultOperator, approverSignatureAndExpiry, salt); +// cheats.stopPrank(); +// } + +// /** +// * @notice Like `testDelegateToOperatorWhoRequiresECDSASignature` but using an incorrect signature on purpose and checking that reversion occurs +// */ +// function testFuzz_Revert_WhenOperatorWhoRequiresECDSASignature_WithBadSignature( +// address staker, +// uint256 expiry +// ) public filterFuzzedAddressInputs(staker) { +// // filter to only valid `expiry` values +// expiry = bound(expiry, block.timestamp + 1, type(uint256).max); +// // filter inputs, since this will fail when the staker is already registered as an operator +// cheats.assume(staker != defaultOperator && staker != defaultApprover); + +// _registerOperatorWithDelegationApprover(defaultOperator); + +// // calculate the signature +// ISignatureUtils.SignatureWithExpiry memory approverSignatureAndExpiry; +// approverSignatureAndExpiry.expiry = expiry; +// { +// bytes32 digestHash = delegationManager.calculateDelegationApprovalDigestHash( +// staker, +// defaultOperator, +// delegationManager.delegationApprover(defaultOperator), +// emptySalt, +// expiry +// ); +// (uint8 v, bytes32 r, bytes32 s) = cheats.sign(delegationSignerPrivateKey, digestHash); +// // mess up the signature by flipping v's parity +// v = (v == 27 ? 28 : 27); +// approverSignatureAndExpiry.signature = abi.encodePacked(r, s, v); +// } + +// // try to delegate from the `staker` to the operator, and check reversion +// cheats.startPrank(staker); +// cheats.expectRevert("EIP1271SignatureUtils.checkSignature_EIP1271: signature not from signer"); +// delegationManager.delegateTo(defaultOperator, approverSignatureAndExpiry, emptySalt); +// cheats.stopPrank(); +// } + +// /** +// * @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( +// address staker, +// bytes32 salt, +// uint256 expiry +// ) public filterFuzzedAddressInputs(staker) { +// // filter to only valid `expiry` values +// cheats.assume(expiry >= block.timestamp); +// // filter inputs, since this will fail when the staker is already registered as an operator +// cheats.assume(staker != defaultOperator); + +// _registerOperatorWithDelegationApprover(defaultOperator); + +// // verify that the salt hasn't been used before +// assertFalse( +// delegationManager.delegationApproverSaltIsSpent( +// delegationManager.delegationApprover(defaultOperator), +// salt +// ), +// "salt somehow spent too early?" +// ); +// // calculate the delegationSigner's signature +// ISignatureUtils.SignatureWithExpiry memory approverSignatureAndExpiry = _getApproverSignature( +// delegationSignerPrivateKey, +// staker, +// defaultOperator, +// salt, +// expiry +// ); + +// // delegate from the `staker` to the operator +// cheats.startPrank(staker); +// cheats.expectEmit(true, true, true, true, address(delegationManager)); +// emit StakerDelegated(staker, defaultOperator); +// delegationManager.delegateTo(defaultOperator, approverSignatureAndExpiry, salt); +// cheats.stopPrank(); + +// assertFalse(delegationManager.isOperator(staker), "staker incorrectly registered as operator"); +// assertEq(delegationManager.delegatedTo(staker), defaultOperator, "staker delegated to the wrong address"); +// assertFalse(delegationManager.isOperator(staker), "staker incorrectly registered as operator"); + +// if (staker == delegationManager.delegationApprover(defaultOperator)) { +// // verify that the salt is still marked as unused (since it wasn't checked or used) +// assertFalse( +// delegationManager.delegationApproverSaltIsSpent( +// delegationManager.delegationApprover(defaultOperator), +// salt +// ), +// "salt somehow spent too incorrectly?" +// ); +// } else { +// // verify that the salt is marked as used +// assertTrue( +// delegationManager.delegationApproverSaltIsSpent( +// delegationManager.delegationApprover(defaultOperator), +// salt +// ), +// "salt somehow spent not spent?" +// ); +// } +// } + +// /** +// * @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( +// address staker, +// bytes32 salt, +// uint256 expiry, +// uint256 shares +// ) public filterFuzzedAddressInputs(staker) { +// // filter to only valid `expiry` values +// cheats.assume(expiry >= block.timestamp); +// // filter inputs, since this will fail when the staker is already registered as an operator +// cheats.assume(staker != defaultOperator); + +// _registerOperatorWithDelegationApprover(defaultOperator); + +// // verify that the salt hasn't been used before +// assertFalse( +// delegationManager.delegationApproverSaltIsSpent( +// delegationManager.delegationApprover(defaultOperator), +// salt +// ), +// "salt somehow spent too early?" +// ); +// // calculate the delegationSigner's signature +// ISignatureUtils.SignatureWithExpiry memory approverSignatureAndExpiry = _getApproverSignature( +// delegationSignerPrivateKey, +// staker, +// defaultOperator, +// salt, +// expiry +// ); + +// // Set staker shares in StrategyManager +// IStrategy[] memory strategiesToReturn = new IStrategy[](1); +// strategiesToReturn[0] = strategyMock; +// uint256[] memory sharesToReturn = new uint256[](1); +// sharesToReturn[0] = shares; +// strategyManagerMock.setDeposits(staker, strategiesToReturn, sharesToReturn); +// uint256 operatorSharesBefore = delegationManager.operatorShares(defaultOperator, strategyMock); +// // delegate from the `staker` to the operator +// cheats.startPrank(staker); +// cheats.expectEmit(true, true, true, true, address(delegationManager)); +// emit StakerDelegated(staker, defaultOperator); +// delegationManager.delegateTo(defaultOperator, approverSignatureAndExpiry, salt); +// cheats.stopPrank(); +// uint256 operatorSharesAfter = delegationManager.operatorShares(defaultOperator, strategyMock); +// assertEq(operatorSharesBefore + shares, operatorSharesAfter, "operator shares not increased correctly"); +// assertFalse(delegationManager.isOperator(staker), "staker incorrectly registered as operator"); +// assertEq(delegationManager.delegatedTo(staker), defaultOperator, "staker delegated to the wrong address"); +// assertFalse(delegationManager.isOperator(staker), "staker incorrectly registered as operator"); + +// if (staker == delegationManager.delegationApprover(defaultOperator)) { +// // verify that the salt is still marked as unused (since it wasn't checked or used) +// assertFalse( +// delegationManager.delegationApproverSaltIsSpent( +// delegationManager.delegationApprover(defaultOperator), +// salt +// ), +// "salt somehow spent too incorrectly?" +// ); +// } else { +// // verify that the salt is marked as used +// assertTrue( +// delegationManager.delegationApproverSaltIsSpent( +// delegationManager.delegationApprover(defaultOperator), +// salt +// ), +// "salt somehow spent not spent?" +// ); +// } +// } + +// /** +// * @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( +// address staker, +// bytes32 salt, +// uint256 expiry, +// int256 beaconShares +// ) public filterFuzzedAddressInputs(staker) { +// // filter to only valid `expiry` values +// cheats.assume(expiry >= block.timestamp); +// // filter inputs, since this will fail when the staker is already registered as an operator +// cheats.assume(staker != defaultOperator); + +// _registerOperatorWithDelegationApprover(defaultOperator); + +// // verify that the salt hasn't been used before +// assertFalse( +// delegationManager.delegationApproverSaltIsSpent( +// delegationManager.delegationApprover(defaultOperator), +// salt +// ), +// "salt somehow spent too early?" +// ); +// // calculate the delegationSigner's signature +// ISignatureUtils.SignatureWithExpiry memory approverSignatureAndExpiry = _getApproverSignature( +// delegationSignerPrivateKey, +// staker, +// defaultOperator, +// salt, +// expiry +// ); + +// // Set staker shares in BeaconChainStrategy +// eigenPodManagerMock.setPodOwnerShares(staker, beaconShares); +// uint256 beaconSharesBefore = delegationManager.operatorShares(staker, beaconChainETHStrategy); +// // delegate from the `staker` to the operator +// cheats.startPrank(staker); +// cheats.expectEmit(true, true, true, true, address(delegationManager)); +// emit StakerDelegated(staker, defaultOperator); +// if (beaconShares > 0) { +// cheats.expectEmit(true, true, true, true, address(delegationManager)); +// emit OperatorSharesIncreased(defaultOperator, staker, beaconChainETHStrategy, uint256(beaconShares)); +// } +// delegationManager.delegateTo(defaultOperator, approverSignatureAndExpiry, salt); +// cheats.stopPrank(); +// uint256 beaconSharesAfter = delegationManager.operatorShares(defaultOperator, beaconChainETHStrategy); +// if (beaconShares <= 0) { +// assertEq( +// beaconSharesBefore, +// beaconSharesAfter, +// "operator beaconchain shares should not have increased with negative shares" +// ); +// } else { +// assertEq( +// beaconSharesBefore + uint256(beaconShares), +// beaconSharesAfter, +// "operator beaconchain shares not increased correctly" +// ); +// } +// assertFalse(delegationManager.isOperator(staker), "staker incorrectly registered as operator"); +// assertEq(delegationManager.delegatedTo(staker), defaultOperator, "staker delegated to the wrong address"); +// assertFalse(delegationManager.isOperator(staker), "staker incorrectly registered as operator"); + +// if (staker == delegationManager.delegationApprover(defaultOperator)) { +// // verify that the salt is still marked as unused (since it wasn't checked or used) +// assertFalse( +// delegationManager.delegationApproverSaltIsSpent( +// delegationManager.delegationApprover(defaultOperator), +// salt +// ), +// "salt somehow spent too incorrectly?" +// ); +// } else { +// // verify that the salt is marked as used +// assertTrue( +// delegationManager.delegationApproverSaltIsSpent( +// delegationManager.delegationApprover(defaultOperator), +// salt +// ), +// "salt somehow spent not spent?" +// ); +// } +// } + +// /** +// * @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( +// address staker, +// bytes32 salt, +// uint256 expiry, +// int256 beaconShares, +// uint256 shares +// ) public filterFuzzedAddressInputs(staker) { +// // filter to only valid `expiry` values +// cheats.assume(expiry >= block.timestamp); + +// // filter inputs, since this will fail when the staker is already registered as an operator +// cheats.assume(staker != defaultOperator); +// _registerOperatorWithDelegationApprover(defaultOperator); + +// // verify that the salt hasn't been used before +// assertFalse( +// delegationManager.delegationApproverSaltIsSpent( +// delegationManager.delegationApprover(defaultOperator), +// salt +// ), +// "salt somehow spent too early?" +// ); +// // calculate the delegationSigner's signature +// ISignatureUtils.SignatureWithExpiry memory approverSignatureAndExpiry = _getApproverSignature( +// delegationSignerPrivateKey, +// staker, +// defaultOperator, +// salt, +// expiry +// ); + +// // Set staker shares in BeaconChainStrategy and StrategyMananger +// { +// IStrategy[] memory strategiesToReturn = new IStrategy[](1); +// strategiesToReturn[0] = strategyMock; +// uint256[] memory sharesToReturn = new uint256[](1); +// sharesToReturn[0] = shares; +// strategyManagerMock.setDeposits(staker, strategiesToReturn, sharesToReturn); +// eigenPodManagerMock.setPodOwnerShares(staker, beaconShares); +// } +// uint256 operatorSharesBefore = delegationManager.operatorShares(defaultOperator, strategyMock); +// uint256 beaconSharesBefore = delegationManager.operatorShares(staker, beaconChainETHStrategy); +// // delegate from the `staker` to the operator +// cheats.startPrank(staker); +// cheats.expectEmit(true, true, true, true, address(delegationManager)); +// emit StakerDelegated(staker, defaultOperator); +// cheats.expectEmit(true, true, true, true, address(delegationManager)); +// emit OperatorSharesIncreased(defaultOperator, staker, strategyMock, shares); +// if (beaconShares > 0) { +// cheats.expectEmit(true, true, true, true, address(delegationManager)); +// emit OperatorSharesIncreased(defaultOperator, staker, beaconChainETHStrategy, uint256(beaconShares)); +// } +// delegationManager.delegateTo(defaultOperator, approverSignatureAndExpiry, salt); +// cheats.stopPrank(); +// uint256 operatorSharesAfter = delegationManager.operatorShares(defaultOperator, strategyMock); +// uint256 beaconSharesAfter = delegationManager.operatorShares(defaultOperator, beaconChainETHStrategy); +// if (beaconShares <= 0) { +// assertEq( +// beaconSharesBefore, +// beaconSharesAfter, +// "operator beaconchain shares should not have increased with negative shares" +// ); +// } else { +// assertEq( +// beaconSharesBefore + uint256(beaconShares), +// beaconSharesAfter, +// "operator beaconchain shares not increased correctly" +// ); +// } +// assertEq(operatorSharesBefore + shares, operatorSharesAfter, "operator shares not increased correctly"); +// assertFalse(delegationManager.isOperator(staker), "staker incorrectly registered as operator"); +// assertEq(delegationManager.delegatedTo(staker), defaultOperator, "staker delegated to the wrong address"); +// assertFalse(delegationManager.isOperator(staker), "staker incorrectly registered as operator"); + +// if (staker == delegationManager.delegationApprover(defaultOperator)) { +// // verify that the salt is still marked as unused (since it wasn't checked or used) +// assertFalse( +// delegationManager.delegationApproverSaltIsSpent( +// delegationManager.delegationApprover(defaultOperator), +// salt +// ), +// "salt somehow spent too incorrectly?" +// ); +// } else { +// // verify that the salt is marked as used +// assertTrue( +// delegationManager.delegationApproverSaltIsSpent( +// delegationManager.delegationApprover(defaultOperator), +// salt +// ), +// "salt somehow spent not spent?" +// ); +// } +// } + +// /** +// * @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( +// address staker, +// uint256 expiry +// ) public filterFuzzedAddressInputs(staker) { +// // roll to a very late timestamp +// skip(type(uint256).max / 2); +// // filter to only *invalid* `expiry` values +// expiry = bound(expiry, 0, block.timestamp - 1); +// // filter inputs, since this will fail when the staker is already registered as an operator +// cheats.assume(staker != defaultOperator); + +// _registerOperatorWithDelegationApprover(defaultOperator); + +// // create the signature struct +// ISignatureUtils.SignatureWithExpiry memory approverSignatureAndExpiry; +// approverSignatureAndExpiry.expiry = expiry; + +// // try to delegate from the `staker` to the operator, and check reversion +// cheats.startPrank(staker); +// cheats.expectRevert("DelegationManager._delegate: approver signature expired"); +// delegationManager.delegateTo(defaultOperator, approverSignatureAndExpiry, emptySalt); +// cheats.stopPrank(); +// } + +// /** +// * @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( +// address staker, +// bytes32 salt, +// uint256 expiry +// ) public filterFuzzedAddressInputs(staker) { +// // filter to only valid `expiry` values +// cheats.assume(expiry >= block.timestamp); + +// // register *this contract* as an operator +// // filter inputs, since this will fail when the staker is already registered as an operator +// ERC1271WalletMock wallet = _registerOperatorWith1271DelegationApprover(defaultOperator); +// cheats.assume(staker != address(wallet) && staker != defaultOperator); + +// // calculate the delegationSigner's signature +// ISignatureUtils.SignatureWithExpiry memory approverSignatureAndExpiry = _getApproverSignature( +// delegationSignerPrivateKey, +// staker, +// defaultOperator, +// salt, +// expiry +// ); + +// // delegate from the `staker` to the operator +// cheats.startPrank(staker); +// cheats.expectEmit(true, true, true, true, address(delegationManager)); +// emit StakerDelegated(staker, defaultOperator); +// delegationManager.delegateTo(defaultOperator, approverSignatureAndExpiry, salt); +// delegationManager.undelegate(staker); +// // Reusing same signature should revert with salt already being used +// cheats.expectRevert("DelegationManager._delegate: approverSalt already spent"); +// delegationManager.delegateTo(defaultOperator, approverSignatureAndExpiry, salt); +// cheats.stopPrank(); +// } + +// /** +// * @notice delegateTo test with operator's delegationApprover address set to a contract address that +// * is non compliant with EIP1271 +// */ +// function testFuzz_Revert_WhenOperatorWhoRequiresEIP1271Signature_NonCompliantWallet( +// address staker, +// uint256 expiry +// ) public filterFuzzedAddressInputs(staker) { +// // filter to only valid `expiry` values +// cheats.assume(expiry >= block.timestamp); + +// // register *this contract* as an operator +// // filter inputs, since this will fail when the staker is already registered as an operator +// cheats.assume(staker != defaultOperator); + +// // deploy a ERC1271MaliciousMock contract that will return an incorrect value when called +// ERC1271MaliciousMock wallet = new ERC1271MaliciousMock(); + +// // filter fuzzed input, since otherwise we can get a flaky failure here. if the caller itself is the 'delegationApprover' +// // then we don't even trigger the signature verification call, so we won't get a revert as expected +// cheats.assume(staker != address(wallet)); + +// IDelegationManager.OperatorDetails memory operatorDetails = IDelegationManager.OperatorDetails({ +// __deprecated_earningsReceiver: defaultOperator, +// delegationApprover: address(wallet), +// stakerOptOutWindowBlocks: 0 +// }); +// _registerOperator(defaultOperator, operatorDetails, emptyStringForMetadataURI); + +// // create the signature struct +// ISignatureUtils.SignatureWithExpiry memory approverSignatureAndExpiry; +// approverSignatureAndExpiry.expiry = expiry; + +// // try to delegate from the `staker` to the operator, and check reversion +// cheats.startPrank(staker); +// // 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 +// cheats.expectRevert(); +// delegationManager.delegateTo(defaultOperator, approverSignatureAndExpiry, emptySalt); +// cheats.stopPrank(); +// } + +// /** +// * @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( +// address staker, +// bytes32 salt, +// uint256 expiry +// ) public filterFuzzedAddressInputs(staker) { +// // filter to only valid `expiry` values +// cheats.assume(expiry >= block.timestamp); + +// // register *this contract* as an operator +// // filter inputs, since this will fail when the staker is already registered as an operator +// cheats.assume(staker != defaultOperator); + +// // deploy a ERC1271WalletMock contract that will return an incorrect value when called +// // owner is the 0 address +// ERC1271WalletMock wallet = new ERC1271WalletMock(address(1)); + +// // filter fuzzed input, since otherwise we can get a flaky failure here. if the caller itself is the 'delegationApprover' +// // then we don't even trigger the signature verification call, so we won't get a revert as expected +// cheats.assume(staker != address(wallet)); + +// IDelegationManager.OperatorDetails memory operatorDetails = IDelegationManager.OperatorDetails({ +// __deprecated_earningsReceiver: defaultOperator, +// delegationApprover: address(wallet), +// stakerOptOutWindowBlocks: 0 +// }); +// _registerOperator(defaultOperator, operatorDetails, emptyStringForMetadataURI); + +// // calculate the delegationSigner's but this is not the correct signature from the wallet contract +// // since the wallet owner is address(1) +// ISignatureUtils.SignatureWithExpiry memory approverSignatureAndExpiry = _getApproverSignature( +// delegationSignerPrivateKey, +// staker, +// defaultOperator, +// salt, +// expiry +// ); + +// // try to delegate from the `staker` to the operator, and check reversion +// cheats.startPrank(staker); +// // Signature should fail as the wallet will not return EIP1271_MAGICVALUE +// cheats.expectRevert("EIP1271SignatureUtils.checkSignature_EIP1271: ERC1271 signature verification failed"); +// delegationManager.delegateTo(defaultOperator, approverSignatureAndExpiry, emptySalt); +// cheats.stopPrank(); +// } + +// /** +// * @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( +// address staker, +// bytes32 salt, +// uint256 expiry +// ) public filterFuzzedAddressInputs(staker) { +// // filter to only valid `expiry` values +// cheats.assume(expiry >= block.timestamp); + +// // register *this contract* as an operator +// // filter inputs, since this will fail when the staker is already registered as an operator +// cheats.assume(staker != defaultOperator); + +// _registerOperatorWith1271DelegationApprover(defaultOperator); + +// // verify that the salt hasn't been used before +// assertFalse( +// delegationManager.delegationApproverSaltIsSpent( +// delegationManager.delegationApprover(defaultOperator), +// salt +// ), +// "salt somehow spent too early?" +// ); +// // calculate the delegationSigner's signature +// ISignatureUtils.SignatureWithExpiry memory approverSignatureAndExpiry = _getApproverSignature( +// delegationSignerPrivateKey, +// staker, +// defaultOperator, +// salt, +// expiry +// ); + +// // delegate from the `staker` to the operator +// cheats.startPrank(staker); +// cheats.expectEmit(true, true, true, true, address(delegationManager)); +// emit StakerDelegated(staker, defaultOperator); +// delegationManager.delegateTo(defaultOperator, approverSignatureAndExpiry, salt); +// cheats.stopPrank(); + +// assertTrue(delegationManager.isDelegated(staker), "staker not delegated correctly"); +// assertEq(delegationManager.delegatedTo(staker), defaultOperator, "staker delegated to the wrong address"); +// assertFalse(delegationManager.isOperator(staker), "staker incorrectly registered as operator"); + +// // check that the nonce incremented appropriately +// if (staker == defaultOperator || staker == delegationManager.delegationApprover(defaultOperator)) { +// // verify that the salt is still marked as unused (since it wasn't checked or used) +// assertFalse( +// delegationManager.delegationApproverSaltIsSpent( +// delegationManager.delegationApprover(defaultOperator), +// salt +// ), +// "salt somehow spent too incorrectly?" +// ); +// } else { +// // verify that the salt is marked as used +// assertTrue( +// delegationManager.delegationApproverSaltIsSpent( +// delegationManager.delegationApprover(defaultOperator), +// salt +// ), +// "salt somehow spent not spent?" +// ); +// } +// } +// } + +// contract DelegationManagerUnitTests_delegateToBySignature is DelegationManagerUnitTests { +// function test_revert_paused() public { +// cheats.prank(defaultOperator); +// delegationManager.registerAsOperator( +// IDelegationManager.OperatorDetails({ +// __deprecated_earningsReceiver: defaultOperator, +// delegationApprover: address(0), +// stakerOptOutWindowBlocks: 0 +// }), +// emptyStringForMetadataURI +// ); + +// // set the pausing flag +// cheats.prank(pauser); +// delegationManager.pause(2 ** PAUSED_NEW_DELEGATION); + +// uint256 expiry = type(uint256).max; +// ISignatureUtils.SignatureWithExpiry memory stakerSignatureAndExpiry = _getStakerSignature( +// stakerPrivateKey, +// defaultOperator, +// expiry +// ); +// ISignatureUtils.SignatureWithExpiry memory approverSignatureAndExpiry; +// cheats.expectRevert("Pausable: index is paused"); +// delegationManager.delegateToBySignature( +// defaultStaker, +// defaultOperator, +// stakerSignatureAndExpiry, +// approverSignatureAndExpiry, +// emptySalt +// ); +// } + +// /// @notice Checks that `DelegationManager.delegateToBySignature` reverts if the staker's signature has expired +// function testFuzz_Revert_WhenStakerSignatureExpired( +// address staker, +// address operator, +// uint256 expiry, +// bytes memory signature +// ) public filterFuzzedAddressInputs(staker) filterFuzzedAddressInputs(operator) { +// expiry = bound(expiry, 0, block.timestamp - 1); +// cheats.expectRevert("DelegationManager.delegateToBySignature: staker signature expired"); +// ISignatureUtils.SignatureWithExpiry memory signatureWithExpiry = ISignatureUtils.SignatureWithExpiry({ +// signature: signature, +// expiry: expiry +// }); +// delegationManager.delegateToBySignature(staker, operator, signatureWithExpiry, signatureWithExpiry, emptySalt); +// } + +// /// @notice Checks that `DelegationManager.delegateToBySignature` reverts if the staker's ECDSA signature verification fails +// function test_Revert_EOAStaker_WhenStakerSignatureVerificationFails() public { +// address invalidStaker = address(1000); +// address caller = address(2000); +// uint256 expiry = type(uint256).max; + +// _registerOperatorWithBaseDetails(defaultOperator); + +// ISignatureUtils.SignatureWithExpiry memory stakerSignatureAndExpiry = _getStakerSignature( +// stakerPrivateKey, +// defaultOperator, +// expiry +// ); + +// // delegate from the `staker` to the operator, via having the `caller` call `DelegationManager.delegateToBySignature` +// // Should revert from invalid signature as staker is not set as the address of signer +// cheats.startPrank(caller); +// cheats.expectRevert("EIP1271SignatureUtils.checkSignature_EIP1271: signature not from signer"); +// // use an empty approver signature input since none is needed / the input is unchecked +// ISignatureUtils.SignatureWithExpiry memory approverSignatureAndExpiry; +// delegationManager.delegateToBySignature( +// invalidStaker, +// defaultOperator, +// stakerSignatureAndExpiry, +// approverSignatureAndExpiry, +// emptySalt +// ); +// cheats.stopPrank(); +// } + +// /// @notice Checks that `DelegationManager.delegateToBySignature` reverts if the staker's contract signature verification fails +// function test_Revert_ERC1271Staker_WhenStakerSignatureVerficationFails() public { +// address staker = address(new ERC1271WalletMock(address(1))); +// address caller = address(2000); +// uint256 expiry = type(uint256).max; + +// _registerOperatorWithBaseDetails(defaultOperator); + +// ISignatureUtils.SignatureWithExpiry memory stakerSignatureAndExpiry = _getStakerSignature( +// stakerPrivateKey, +// defaultOperator, +// expiry +// ); + +// // delegate from the `staker` to the operator, via having the `caller` call `DelegationManager.delegateToBySignature` +// // Should revert from invalid signature as staker is not set as the address of signer +// cheats.startPrank(caller); +// cheats.expectRevert("EIP1271SignatureUtils.checkSignature_EIP1271: ERC1271 signature verification failed"); +// // use an empty approver signature input since none is needed / the input is unchecked +// ISignatureUtils.SignatureWithExpiry memory approverSignatureAndExpiry; +// delegationManager.delegateToBySignature( +// staker, +// defaultOperator, +// stakerSignatureAndExpiry, +// approverSignatureAndExpiry, +// emptySalt +// ); +// cheats.stopPrank(); +// } + +// /// @notice Checks that `DelegationManager.delegateToBySignature` reverts when the staker is already delegated +// function test_Revert_Staker_WhenAlreadyDelegated() public { +// address staker = cheats.addr(stakerPrivateKey); +// address caller = address(2000); +// uint256 expiry = type(uint256).max; + +// _registerOperatorWithBaseDetails(defaultOperator); + +// ISignatureUtils.SignatureWithExpiry memory stakerSignatureAndExpiry = _getStakerSignature( +// stakerPrivateKey, +// defaultOperator, +// expiry +// ); + +// _delegateToOperatorWhoAcceptsAllStakers(staker, defaultOperator); +// // delegate from the `staker` to the operator, via having the `caller` call `DelegationManager.delegateToBySignature` +// // Should revert as `staker` has already delegated to `operator` +// cheats.startPrank(caller); +// cheats.expectRevert("DelegationManager.delegateToBySignature: staker is already actively delegated"); +// // use an empty approver signature input since none is needed / the input is unchecked +// ISignatureUtils.SignatureWithExpiry memory approverSignatureAndExpiry; +// delegationManager.delegateToBySignature( +// staker, +// defaultOperator, +// stakerSignatureAndExpiry, +// approverSignatureAndExpiry, +// emptySalt +// ); +// cheats.stopPrank(); +// } + +// /// @notice Checks that `delegateToBySignature` reverts when operator is not registered after successful staker signature verification +// function test_Revert_EOAStaker_OperatorNotRegistered() public { +// address staker = cheats.addr(stakerPrivateKey); +// address caller = address(2000); +// uint256 expiry = type(uint256).max; + +// ISignatureUtils.SignatureWithExpiry memory stakerSignatureAndExpiry = _getStakerSignature( +// stakerPrivateKey, +// defaultOperator, +// expiry +// ); + +// // delegate from the `staker` to the operator, via having the `caller` call `DelegationManager.delegateToBySignature` +// // Should revert as `operator` is not registered +// cheats.startPrank(caller); +// cheats.expectRevert("DelegationManager.delegateToBySignature: operator is not registered in EigenLayer"); +// // use an empty approver signature input since none is needed / the input is unchecked +// ISignatureUtils.SignatureWithExpiry memory approverSignatureAndExpiry; +// delegationManager.delegateToBySignature( +// staker, +// defaultOperator, +// stakerSignatureAndExpiry, +// approverSignatureAndExpiry, +// emptySalt +// ); +// cheats.stopPrank(); +// } + +// /** +// * @notice Checks that `DelegationManager.delegateToBySignature` reverts if the delegationApprover's signature has expired +// * after successful staker signature verification +// */ +// function testFuzz_Revert_WhenDelegationApproverSignatureExpired( +// address caller, +// uint256 stakerExpiry, +// uint256 delegationApproverExpiry +// ) public filterFuzzedAddressInputs(caller) { +// cheats.assume(caller != defaultOperator); - // roll to a very late timestamp - skip(type(uint256).max / 2); - - // filter to only valid `stakerExpiry` values - stakerExpiry = bound(stakerExpiry, block.timestamp + 1, type(uint256).max); - // filter to only *invalid* `delegationApproverExpiry` values - delegationApproverExpiry = bound(delegationApproverExpiry, 0, block.timestamp - 1); - - console.log("timestamp: %s", block.timestamp); - console.log(stakerExpiry); - console.log(delegationApproverExpiry); - - - _registerOperatorWithDelegationApprover(defaultOperator); - - // calculate the delegationSigner's signature - ISignatureUtils.SignatureWithExpiry memory approverSignatureAndExpiry = _getApproverSignature( - delegationSignerPrivateKey, - defaultStaker, - defaultOperator, - emptySalt, - delegationApproverExpiry - ); - - // calculate the staker signature - ISignatureUtils.SignatureWithExpiry memory stakerSignatureAndExpiry = _getStakerSignature( - stakerPrivateKey, - defaultOperator, - stakerExpiry - ); - - // try delegate from the `staker` to the operator, via having the `caller` call `DelegationManager.delegateToBySignature`, and check for reversion - cheats.startPrank(caller); - cheats.expectRevert("DelegationManager._delegate: approver signature expired"); - delegationManager.delegateToBySignature( - defaultStaker, - defaultOperator, - stakerSignatureAndExpiry, - approverSignatureAndExpiry, - emptySalt - ); - cheats.stopPrank(); - } - - /** - * @notice `staker` becomes delegated 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 `caller` calling `DelegationManager.delegateToBySignature` - * The function should pass with any `operatorSignature` input (since it should be unused) - * The function should pass only with a valid `stakerSignatureAndExpiry` input - * Properly emits a `StakerDelegated` event - * Staker is correctly delegated after the call (i.e. correct storage update) - * BeaconChainStrategy and StrategyManager operator shares should increase for operator - * 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_EOAStaker_OperatorWhoAcceptsAllStakers( - address caller, - uint256 expiry, - int256 beaconShares, - uint256 shares - ) public filterFuzzedAddressInputs(caller) { - cheats.assume(expiry >= block.timestamp); - cheats.assume(shares > 0); - - _registerOperatorWithBaseDetails(defaultOperator); - - // verify that the salt hasn't been used before - assertFalse( - delegationManager.delegationApproverSaltIsSpent( - delegationManager.delegationApprover(defaultOperator), - emptySalt - ), - "salt somehow spent too early?" - ); - { - // Set staker shares in BeaconChainStrategy and StrategyMananger - IStrategy[] memory strategiesToReturn = new IStrategy[](1); - strategiesToReturn[0] = strategyMock; - uint256[] memory sharesToReturn = new uint256[](1); - sharesToReturn[0] = shares; - strategyManagerMock.setDeposits(defaultStaker, strategiesToReturn, sharesToReturn); - eigenPodManagerMock.setPodOwnerShares(defaultStaker, beaconShares); - } - - uint256 operatorSharesBefore = delegationManager.operatorShares(defaultOperator, strategyMock); - uint256 beaconSharesBefore = delegationManager.operatorShares(defaultStaker, beaconChainETHStrategy); - // fetch the staker's current nonce - uint256 currentStakerNonce = delegationManager.stakerNonce(defaultStaker); - // calculate the staker signature - ISignatureUtils.SignatureWithExpiry memory stakerSignatureAndExpiry = _getStakerSignature( - stakerPrivateKey, - defaultOperator, - expiry - ); - - // delegate from the `staker` to the operator, via having the `caller` call `DelegationManager.delegateToBySignature` - cheats.expectEmit(true, true, true, true, address(delegationManager)); - emit StakerDelegated(defaultStaker, defaultOperator); - cheats.expectEmit(true, true, true, true, address(delegationManager)); - emit OperatorSharesIncreased(defaultOperator, defaultStaker, strategyMock, shares); - if (beaconShares > 0) { - cheats.expectEmit(true, true, true, true, address(delegationManager)); - emit OperatorSharesIncreased(defaultOperator, defaultStaker, beaconChainETHStrategy, uint256(beaconShares)); - } - _delegateToBySignatureOperatorWhoAcceptsAllStakers( - defaultStaker, - caller, - defaultOperator, - stakerSignatureAndExpiry, - emptySalt - ); - - // Check operator shares increases - uint256 operatorSharesAfter = delegationManager.operatorShares(defaultOperator, strategyMock); - uint256 beaconSharesAfter = delegationManager.operatorShares(defaultOperator, beaconChainETHStrategy); - if (beaconShares <= 0) { - assertEq( - beaconSharesBefore, - beaconSharesAfter, - "operator beaconchain shares should not have increased with negative shares" - ); - } else { - assertEq( - beaconSharesBefore + uint256(beaconShares), - beaconSharesAfter, - "operator beaconchain shares not increased correctly" - ); - } - assertEq(operatorSharesBefore + shares, operatorSharesAfter, "operator shares not increased correctly"); - // check all the delegation status changes - assertTrue(delegationManager.isDelegated(defaultStaker), "staker not delegated correctly"); - assertEq( - delegationManager.delegatedTo(defaultStaker), - defaultOperator, - "staker delegated to the wrong address" - ); - assertFalse(delegationManager.isOperator(defaultStaker), "staker incorrectly registered as operator"); - // check that the staker nonce incremented appropriately - assertEq( - delegationManager.stakerNonce(defaultStaker), - currentStakerNonce + 1, - "staker nonce did not increment" - ); - // verify that the salt is still marked as unused (since it wasn't checked or used) - assertFalse( - delegationManager.delegationApproverSaltIsSpent( - delegationManager.delegationApprover(defaultOperator), - emptySalt - ), - "salt somehow spent too incorrectly?" - ); - } - - /** - * @notice `staker` becomes delegated 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 `caller` calling `DelegationManager.delegateToBySignature` - * The function should pass *only with a valid ECDSA signature from the `delegationApprover`, OR if called by the operator or their delegationApprover themselves - * AND with a valid `stakerSignatureAndExpiry` input - * Properly emits a `StakerDelegated` event - * Staker is correctly delegated after the call (i.e. correct storage update) - * BeaconChainStrategy and StrategyManager operator shares should increase for operator - * 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_EOAStaker_OperatorWhoRequiresECDSASignature( - address caller, - bytes32 salt, - uint256 expiry, - int256 beaconShares, - uint256 shares - ) public filterFuzzedAddressInputs(caller) { - // filter to only valid `expiry` values - cheats.assume(expiry >= block.timestamp); - cheats.assume(shares > 0); - - _registerOperatorWithDelegationApprover(defaultOperator); - - // verify that the salt hasn't been used before - assertFalse( - delegationManager.delegationApproverSaltIsSpent( - delegationManager.delegationApprover(defaultOperator), - salt - ), - "salt somehow spent too early?" - ); - { - // Set staker shares in BeaconChainStrategy and StrategyMananger - IStrategy[] memory strategiesToReturn = new IStrategy[](1); - strategiesToReturn[0] = strategyMock; - uint256[] memory sharesToReturn = new uint256[](1); - sharesToReturn[0] = shares; - strategyManagerMock.setDeposits(defaultStaker, strategiesToReturn, sharesToReturn); - eigenPodManagerMock.setPodOwnerShares(defaultStaker, beaconShares); - } - - uint256 operatorSharesBefore = delegationManager.operatorShares(defaultOperator, strategyMock); - uint256 beaconSharesBefore = delegationManager.operatorShares(defaultStaker, beaconChainETHStrategy); - // fetch the staker's current nonce - uint256 currentStakerNonce = delegationManager.stakerNonce(defaultStaker); - // calculate the staker signature - ISignatureUtils.SignatureWithExpiry memory stakerSignatureAndExpiry = _getStakerSignature( - stakerPrivateKey, - defaultOperator, - expiry - ); - - // delegate from the `staker` to the operator, via having the `caller` call `DelegationManager.delegateToBySignature` - cheats.expectEmit(true, true, true, true, address(delegationManager)); - emit StakerDelegated(defaultStaker, defaultOperator); - cheats.expectEmit(true, true, true, true, address(delegationManager)); - emit OperatorSharesIncreased(defaultOperator, defaultStaker, strategyMock, shares); - if (beaconShares > 0) { - cheats.expectEmit(true, true, true, true, address(delegationManager)); - emit OperatorSharesIncreased(defaultOperator, defaultStaker, beaconChainETHStrategy, uint256(beaconShares)); - } - _delegateToBySignatureOperatorWhoRequiresSig( - defaultStaker, - caller, - defaultOperator, - stakerSignatureAndExpiry, - salt - ); - { - // Check operator shares increases - uint256 operatorSharesAfter = delegationManager.operatorShares(defaultOperator, strategyMock); - uint256 beaconSharesAfter = delegationManager.operatorShares(defaultOperator, beaconChainETHStrategy); - if (beaconShares <= 0) { - assertEq( - beaconSharesBefore, - beaconSharesAfter, - "operator beaconchain shares should not have increased with negative shares" - ); - } else { - assertEq( - beaconSharesBefore + uint256(beaconShares), - beaconSharesAfter, - "operator beaconchain shares not increased correctly" - ); - } - assertEq(operatorSharesBefore + shares, operatorSharesAfter, "operator shares not increased correctly"); - } - assertTrue(delegationManager.isDelegated(defaultStaker), "staker not delegated correctly"); - assertEq( - delegationManager.delegatedTo(defaultStaker), - defaultOperator, - "staker delegated to the wrong address" - ); - assertFalse(delegationManager.isOperator(defaultStaker), "staker incorrectly registered as operator"); - - // check that the delegationApprover nonce incremented appropriately - if (caller == defaultOperator || caller == delegationManager.delegationApprover(defaultOperator)) { - // verify that the salt is still marked as unused (since it wasn't checked or used) - assertFalse( - delegationManager.delegationApproverSaltIsSpent( - delegationManager.delegationApprover(defaultOperator), - salt - ), - "salt somehow spent too incorrectly?" - ); - } else { - // verify that the salt is marked as used - assertTrue( - delegationManager.delegationApproverSaltIsSpent( - delegationManager.delegationApprover(defaultOperator), - salt - ), - "salt somehow spent not spent?" - ); - } - - // check that the staker nonce incremented appropriately - assertEq( - delegationManager.stakerNonce(defaultStaker), - currentStakerNonce + 1, - "staker nonce did not increment" - ); - } - - /** - * @notice `staker` becomes delegated to an operatorwho 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 `caller` calling `DelegationManager.delegateToBySignature` - * 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 - * AND with a valid `stakerSignatureAndExpiry` input - * 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_EOAStaker_OperatorWhoRequiresEIP1271Signature( - address caller, - bytes32 salt, - uint256 expiry, - int256 beaconShares, - uint256 shares - ) public filterFuzzedAddressInputs(caller) { - cheats.assume(expiry >= block.timestamp); - cheats.assume(shares > 0); - - _registerOperatorWith1271DelegationApprover(defaultOperator); - - // verify that the salt hasn't been used before - assertFalse( - delegationManager.delegationApproverSaltIsSpent( - delegationManager.delegationApprover(defaultOperator), - salt - ), - "salt somehow spent too early?" - ); - { - // Set staker shares in BeaconChainStrategy and StrategyMananger - IStrategy[] memory strategiesToReturn = new IStrategy[](1); - strategiesToReturn[0] = strategyMock; - uint256[] memory sharesToReturn = new uint256[](1); - sharesToReturn[0] = shares; - strategyManagerMock.setDeposits(defaultStaker, strategiesToReturn, sharesToReturn); - eigenPodManagerMock.setPodOwnerShares(defaultStaker, beaconShares); - } - - uint256 operatorSharesBefore = delegationManager.operatorShares(defaultOperator, strategyMock); - uint256 beaconSharesBefore = delegationManager.operatorShares(defaultStaker, beaconChainETHStrategy); - // fetch the staker's current nonce - uint256 currentStakerNonce = delegationManager.stakerNonce(defaultStaker); - // calculate the staker signature - ISignatureUtils.SignatureWithExpiry memory stakerSignatureAndExpiry = _getStakerSignature( - stakerPrivateKey, - defaultOperator, - expiry - ); - - // delegate from the `staker` to the operator, via having the `caller` call `DelegationManager.delegateToBySignature` - cheats.expectEmit(true, true, true, true, address(delegationManager)); - emit StakerDelegated(defaultStaker, defaultOperator); - cheats.expectEmit(true, true, true, true, address(delegationManager)); - emit OperatorSharesIncreased(defaultOperator, defaultStaker, strategyMock, shares); - if (beaconShares > 0) { - cheats.expectEmit(true, true, true, true, address(delegationManager)); - emit OperatorSharesIncreased(defaultOperator, defaultStaker, beaconChainETHStrategy, uint256(beaconShares)); - } - _delegateToBySignatureOperatorWhoRequiresSig( - defaultStaker, - caller, - defaultOperator, - stakerSignatureAndExpiry, - salt - ); - - { - // Check operator shares increases - uint256 operatorSharesAfter = delegationManager.operatorShares(defaultOperator, strategyMock); - uint256 beaconSharesAfter = delegationManager.operatorShares(defaultOperator, beaconChainETHStrategy); - if (beaconShares <= 0) { - assertEq( - beaconSharesBefore, - beaconSharesAfter, - "operator beaconchain shares should not have increased with negative shares" - ); - } else { - assertEq( - beaconSharesBefore + uint256(beaconShares), - beaconSharesAfter, - "operator beaconchain shares not increased correctly" - ); - } - assertEq(operatorSharesBefore + shares, operatorSharesAfter, "operator shares not increased correctly"); - } - assertTrue(delegationManager.isDelegated(defaultStaker), "staker not delegated correctly"); - assertEq( - delegationManager.delegatedTo(defaultStaker), - defaultOperator, - "staker delegated to the wrong address" - ); - assertFalse(delegationManager.isOperator(defaultStaker), "staker incorrectly registered as operator"); - - // check that the delegationApprover nonce incremented appropriately - if (caller == defaultOperator || caller == delegationManager.delegationApprover(defaultOperator)) { - // verify that the salt is still marked as unused (since it wasn't checked or used) - assertFalse( - delegationManager.delegationApproverSaltIsSpent( - delegationManager.delegationApprover(defaultOperator), - salt - ), - "salt somehow spent too incorrectly?" - ); - } else { - // verify that the salt is marked as used - assertTrue( - delegationManager.delegationApproverSaltIsSpent( - delegationManager.delegationApprover(defaultOperator), - salt - ), - "salt somehow spent not spent?" - ); - } - - // check that the staker nonce incremented appropriately - assertEq( - delegationManager.stakerNonce(defaultStaker), - currentStakerNonce + 1, - "staker nonce did not increment" - ); - } - - /** - * @notice Calls same delegateToBySignature test but with the staker address being a ERC1271WalletMock - * Generates valid signatures from the staker to delegate to operator `defaultOperator` - */ - function testFuzz_ERC1271Staker_OperatorWhoAcceptsAllStakers( - address caller, - uint256 expiry, - int256 beaconShares, - uint256 shares - ) public filterFuzzedAddressInputs(caller) { - defaultStaker = address(ERC1271WalletMock(cheats.addr(stakerPrivateKey))); - testFuzz_EOAStaker_OperatorWhoAcceptsAllStakers(caller, expiry, beaconShares, shares); - } - - /** - * @notice Calls same delegateToBySignature test but with the staker address being a ERC1271WalletMock - * Generates valid signatures from the staker to delegate to operator `defaultOperator` who has - * a delegationApprover address set to a nonzero EOA - */ - function testFuzz_ERC1271Staker_OperatorWhoRequiresECDSASignature( - address caller, - bytes32 salt, - uint256 expiry, - int256 beaconShares, - uint256 shares - ) public filterFuzzedAddressInputs(caller) { - // Call same test but with the staker address being a ERC1271WalletMock - defaultStaker = address(ERC1271WalletMock(cheats.addr(stakerPrivateKey))); - testFuzz_EOAStaker_OperatorWhoRequiresECDSASignature(caller, salt, expiry, beaconShares, shares); - } - - /** - * @notice Calls same delegateToBySignature test but with the staker address being a ERC1271WalletMock - * Generates valid signatures from the staker to delegate to operator `defaultOperator` who has - * a delegationApprover address set to a nonzero ERC1271 compliant contract - */ - function testFuzz_ERC1271Staker_OperatorWhoRequiresEIP1271Signature( - address caller, - bytes32 salt, - uint256 expiry, - int256 beaconShares, - uint256 shares - ) public filterFuzzedAddressInputs(caller) { - // Call same test but with the staker address being a ERC1271WalletMock - defaultStaker = address(ERC1271WalletMock(cheats.addr(stakerPrivateKey))); - testFuzz_EOAStaker_OperatorWhoRequiresEIP1271Signature(caller, salt, expiry, beaconShares, shares); - } -} - -contract DelegationManagerUnitTests_ShareAdjustment is DelegationManagerUnitTests { - // @notice Verifies that `DelegationManager.increaseDelegatedShares` reverts if not called by the StrategyManager nor EigenPodManager - function testFuzz_increaseDelegatedShares_revert_invalidCaller( - address invalidCaller, - uint256 shares - ) public filterFuzzedAddressInputs(invalidCaller) { - cheats.assume(invalidCaller != address(strategyManagerMock)); - cheats.assume(invalidCaller != address(eigenPodManagerMock)); - cheats.assume(invalidCaller != address(eigenLayerProxyAdmin)); - - cheats.expectRevert("DelegationManager: onlyStrategyManagerOrEigenPodManager"); - delegationManager.increaseDelegatedShares(invalidCaller, strategyMock, shares); - } - - // @notice Verifies that there is no change in shares if the staker is not delegated - function testFuzz_increaseDelegatedShares_noop(address staker) public { - cheats.assume(staker != defaultOperator); - _registerOperatorWithBaseDetails(defaultOperator); - assertFalse(delegationManager.isDelegated(staker), "bad test setup"); - - cheats.prank(address(strategyManagerMock)); - delegationManager.increaseDelegatedShares(staker, strategyMock, 1); - assertEq(delegationManager.operatorShares(defaultOperator, strategyMock), 0, "shares should not have changed"); - } - - /** - * @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( - address staker, - uint256 shares, - bool delegateFromStakerToOperator - ) public filterFuzzedAddressInputs(staker) { - // filter inputs, since delegating to the operator will fail when the staker is already registered as an operator - cheats.assume(staker != defaultOperator); - - // Register operator - _registerOperatorWithBaseDetails(defaultOperator); - - // delegate from the `staker` to the operator *if `delegateFromStakerToOperator` is 'true'* - if (delegateFromStakerToOperator) { - _delegateToOperatorWhoAcceptsAllStakers(staker, defaultOperator); - } - - uint256 _delegatedSharesBefore = delegationManager.operatorShares( - delegationManager.delegatedTo(staker), - strategyMock - ); - - if (delegationManager.isDelegated(staker)) { - cheats.expectEmit(true, true, true, true, address(delegationManager)); - emit OperatorSharesIncreased(defaultOperator, staker, strategyMock, shares); - } - - cheats.prank(address(strategyManagerMock)); - delegationManager.increaseDelegatedShares(staker, strategyMock, shares); - - uint256 delegatedSharesAfter = delegationManager.operatorShares( - delegationManager.delegatedTo(staker), - strategyMock - ); - - if (delegationManager.isDelegated(staker)) { - assertEq( - delegatedSharesAfter, - _delegatedSharesBefore + shares, - "delegated shares did not increment correctly" - ); - } else { - assertEq(delegatedSharesAfter, _delegatedSharesBefore, "delegated shares incremented incorrectly"); - assertEq(_delegatedSharesBefore, 0, "nonzero shares delegated to zero address!"); - } - } - - // @notice Verifies that `DelegationManager.decreaseDelegatedShares` reverts if not called by the StrategyManager nor EigenPodManager - function testFuzz_decreaseDelegatedShares_revert_invalidCaller( - address invalidCaller, - uint256 shares - ) public filterFuzzedAddressInputs(invalidCaller) { - cheats.assume(invalidCaller != address(strategyManagerMock)); - cheats.assume(invalidCaller != address(eigenPodManagerMock)); - - cheats.startPrank(invalidCaller); - cheats.expectRevert("DelegationManager: onlyStrategyManagerOrEigenPodManager"); - delegationManager.decreaseDelegatedShares(invalidCaller, strategyMock, shares); - } - - // @notice Verifies that there is no change in shares if the staker is not delegated - function testFuzz_decreaseDelegatedShares_noop(address staker) public { - cheats.assume(staker != defaultOperator); - _registerOperatorWithBaseDetails(defaultOperator); - assertFalse(delegationManager.isDelegated(staker), "bad test setup"); - - cheats.prank(address(strategyManagerMock)); - delegationManager.decreaseDelegatedShares(staker, strategyMock, 1); - assertEq(delegationManager.operatorShares(defaultOperator, strategyMock), 0, "shares should not have changed"); - } - - /** - * @notice Verifies that `DelegationManager.decreaseDelegatedShares` properly decreases the delegated `shares` that the operator - * who the `staker` is delegated to has in the strategies - * @dev Checks that there is no change if the staker is not delegated - */ - function testFuzz_decreaseDelegatedShares( - address staker, - IStrategy[] memory strategies, - uint128 shares, - bool delegateFromStakerToOperator - ) public filterFuzzedAddressInputs(staker) { - // sanity-filtering on fuzzed input length & staker - cheats.assume(strategies.length <= 32); - cheats.assume(staker != defaultOperator); - - // Register operator - _registerOperatorWithBaseDetails(defaultOperator); - - // delegate from the `staker` to the operator *if `delegateFromStakerToOperator` is 'true'* - if (delegateFromStakerToOperator) { - _delegateToOperatorWhoAcceptsAllStakers(staker, defaultOperator); - } - - uint256[] memory sharesInputArray = new uint256[](strategies.length); - - address delegatedTo = delegationManager.delegatedTo(staker); - - // for each strategy in `strategies`, increase delegated shares by `shares` - // noop if the staker is not delegated - cheats.startPrank(address(strategyManagerMock)); - for (uint256 i = 0; i < strategies.length; ++i) { - delegationManager.increaseDelegatedShares(staker, strategies[i], shares); - // 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 - sharesInputArray[i] = shares; - totalSharesForStrategyInArray[address(strategies[i])] += sharesInputArray[i]; - } - cheats.stopPrank(); - - bool isDelegated = delegationManager.isDelegated(staker); - - // for each strategy in `strategies`, decrease delegated shares by `shares` - { - cheats.startPrank(address(strategyManagerMock)); - address operatorToDecreaseSharesOf = delegationManager.delegatedTo(staker); - if (isDelegated) { - for (uint256 i = 0; i < strategies.length; ++i) { - cheats.expectEmit(true, true, true, true, address(delegationManager)); - emit OperatorSharesDecreased( - operatorToDecreaseSharesOf, - staker, - strategies[i], - sharesInputArray[i] - ); - delegationManager.decreaseDelegatedShares(staker, strategies[i], sharesInputArray[i]); - } - } - cheats.stopPrank(); - } - - // check shares after call to `decreaseDelegatedShares` - for (uint256 i = 0; i < strategies.length; ++i) { - uint256 delegatedSharesAfter = delegationManager.operatorShares(delegatedTo, strategies[i]); - - if (isDelegated) { - assertEq( - delegatedSharesAfter + totalSharesForStrategyInArray[address(strategies[i])], - delegatedSharesBefore[strategies[i]], - "delegated shares did not decrement correctly" - ); - assertEq(delegatedSharesAfter, 0, "nonzero shares delegated to"); - } else { - assertEq( - delegatedSharesAfter, - delegatedSharesBefore[strategies[i]], - "delegated shares decremented incorrectly" - ); - assertEq(delegatedSharesBefore[strategies[i]], 0, "nonzero shares delegated to zero address!"); - } - } - } -} - -contract DelegationManagerUnitTests_Undelegate is DelegationManagerUnitTests { - // @notice Verifies that undelegating is not possible when the "undelegation paused" switch is flipped - function test_undelegate_revert_paused(address staker) public filterFuzzedAddressInputs(staker) { - // set the pausing flag - cheats.prank(pauser); - delegationManager.pause(2 ** PAUSED_ENTER_WITHDRAWAL_QUEUE); - - cheats.prank(staker); - cheats.expectRevert("Pausable: index is paused"); - delegationManager.undelegate(staker); - } - - function testFuzz_undelegate_revert_notDelgated( - address undelegatedStaker - ) public filterFuzzedAddressInputs(undelegatedStaker) { - cheats.assume(undelegatedStaker != defaultOperator); - assertFalse(delegationManager.isDelegated(undelegatedStaker), "bad test setup"); - - cheats.prank(undelegatedStaker); - cheats.expectRevert("DelegationManager.undelegate: staker must be delegated to undelegate"); - delegationManager.undelegate(undelegatedStaker); - } - - // @notice Verifies that an operator cannot undelegate from themself (this should always be forbidden) - function testFuzz_undelegate_revert_stakerIsOperator(address operator) public filterFuzzedAddressInputs(operator) { - _registerOperatorWithBaseDetails(operator); - - cheats.prank(operator); - cheats.expectRevert("DelegationManager.undelegate: operators cannot be undelegated"); - delegationManager.undelegate(operator); - } - - /** - * @notice verifies that `DelegationManager.undelegate` reverts if trying to undelegate an operator from themselves - * @param callFromOperatorOrApprover -- calls from the operator if 'false' and the 'approver' if true - */ - function testFuzz_undelegate_operatorCannotForceUndelegateThemself( - address delegationApprover, - bool callFromOperatorOrApprover - ) public filterFuzzedAddressInputs(delegationApprover) { - // register *this contract* as an operator with the default `delegationApprover` - _registerOperatorWithDelegationApprover(defaultOperator); - - address caller; - if (callFromOperatorOrApprover) { - caller = delegationApprover; - } else { - caller = defaultOperator; - } - - // try to call the `undelegate` function and check for reversion - cheats.prank(caller); - cheats.expectRevert("DelegationManager.undelegate: operators cannot be undelegated"); - delegationManager.undelegate(defaultOperator); - } - - //TODO: verify that this check is even needed - function test_undelegate_revert_zeroAddress() public { - _registerOperatorWithBaseDetails(defaultOperator); - _delegateToOperatorWhoAcceptsAllStakers(address(0), defaultOperator); - - cheats.prank(address(0)); - cheats.expectRevert("DelegationManager.undelegate: cannot undelegate zero address"); - delegationManager.undelegate(address(0)); - } - - /** - * @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_undelegate_revert_invalidCaller( - address invalidCaller - ) public filterFuzzedAddressInputs(invalidCaller) { - address staker = address(0x123); - // filter out addresses that are actually allowed to call the function - cheats.assume(invalidCaller != staker); - cheats.assume(invalidCaller != defaultOperator); - cheats.assume(invalidCaller != defaultApprover); - - _registerOperatorWithDelegationApprover(defaultOperator); - _delegateToOperatorWhoRequiresSig(staker, defaultOperator); - - cheats.prank(invalidCaller); - cheats.expectRevert("DelegationManager.undelegate: caller cannot undelegate staker"); - delegationManager.undelegate(staker); - } - - /** - * 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(address staker) public filterFuzzedAddressInputs(staker) { - cheats.assume(staker != defaultOperator); +// // roll to a very late timestamp +// skip(type(uint256).max / 2); + +// // filter to only valid `stakerExpiry` values +// stakerExpiry = bound(stakerExpiry, block.timestamp + 1, type(uint256).max); +// // filter to only *invalid* `delegationApproverExpiry` values +// delegationApproverExpiry = bound(delegationApproverExpiry, 0, block.timestamp - 1); + +// console.log("timestamp: %s", block.timestamp); +// console.log(stakerExpiry); +// console.log(delegationApproverExpiry); + + +// _registerOperatorWithDelegationApprover(defaultOperator); + +// // calculate the delegationSigner's signature +// ISignatureUtils.SignatureWithExpiry memory approverSignatureAndExpiry = _getApproverSignature( +// delegationSignerPrivateKey, +// defaultStaker, +// defaultOperator, +// emptySalt, +// delegationApproverExpiry +// ); + +// // calculate the staker signature +// ISignatureUtils.SignatureWithExpiry memory stakerSignatureAndExpiry = _getStakerSignature( +// stakerPrivateKey, +// defaultOperator, +// stakerExpiry +// ); + +// // try delegate from the `staker` to the operator, via having the `caller` call `DelegationManager.delegateToBySignature`, and check for reversion +// cheats.startPrank(caller); +// cheats.expectRevert("DelegationManager._delegate: approver signature expired"); +// delegationManager.delegateToBySignature( +// defaultStaker, +// defaultOperator, +// stakerSignatureAndExpiry, +// approverSignatureAndExpiry, +// emptySalt +// ); +// cheats.stopPrank(); +// } + +// /** +// * @notice `staker` becomes delegated 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 `caller` calling `DelegationManager.delegateToBySignature` +// * The function should pass with any `operatorSignature` input (since it should be unused) +// * The function should pass only with a valid `stakerSignatureAndExpiry` input +// * Properly emits a `StakerDelegated` event +// * Staker is correctly delegated after the call (i.e. correct storage update) +// * BeaconChainStrategy and StrategyManager operator shares should increase for operator +// * 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_EOAStaker_OperatorWhoAcceptsAllStakers( +// address caller, +// uint256 expiry, +// int256 beaconShares, +// uint256 shares +// ) public filterFuzzedAddressInputs(caller) { +// cheats.assume(expiry >= block.timestamp); +// cheats.assume(shares > 0); + +// _registerOperatorWithBaseDetails(defaultOperator); + +// // verify that the salt hasn't been used before +// assertFalse( +// delegationManager.delegationApproverSaltIsSpent( +// delegationManager.delegationApprover(defaultOperator), +// emptySalt +// ), +// "salt somehow spent too early?" +// ); +// { +// // Set staker shares in BeaconChainStrategy and StrategyMananger +// IStrategy[] memory strategiesToReturn = new IStrategy[](1); +// strategiesToReturn[0] = strategyMock; +// uint256[] memory sharesToReturn = new uint256[](1); +// sharesToReturn[0] = shares; +// strategyManagerMock.setDeposits(defaultStaker, strategiesToReturn, sharesToReturn); +// eigenPodManagerMock.setPodOwnerShares(defaultStaker, beaconShares); +// } + +// uint256 operatorSharesBefore = delegationManager.operatorShares(defaultOperator, strategyMock); +// uint256 beaconSharesBefore = delegationManager.operatorShares(defaultStaker, beaconChainETHStrategy); +// // fetch the staker's current nonce +// uint256 currentStakerNonce = delegationManager.stakerNonce(defaultStaker); +// // calculate the staker signature +// ISignatureUtils.SignatureWithExpiry memory stakerSignatureAndExpiry = _getStakerSignature( +// stakerPrivateKey, +// defaultOperator, +// expiry +// ); + +// // delegate from the `staker` to the operator, via having the `caller` call `DelegationManager.delegateToBySignature` +// cheats.expectEmit(true, true, true, true, address(delegationManager)); +// emit StakerDelegated(defaultStaker, defaultOperator); +// cheats.expectEmit(true, true, true, true, address(delegationManager)); +// emit OperatorSharesIncreased(defaultOperator, defaultStaker, strategyMock, shares); +// if (beaconShares > 0) { +// cheats.expectEmit(true, true, true, true, address(delegationManager)); +// emit OperatorSharesIncreased(defaultOperator, defaultStaker, beaconChainETHStrategy, uint256(beaconShares)); +// } +// _delegateToBySignatureOperatorWhoAcceptsAllStakers( +// defaultStaker, +// caller, +// defaultOperator, +// stakerSignatureAndExpiry, +// emptySalt +// ); + +// // Check operator shares increases +// uint256 operatorSharesAfter = delegationManager.operatorShares(defaultOperator, strategyMock); +// uint256 beaconSharesAfter = delegationManager.operatorShares(defaultOperator, beaconChainETHStrategy); +// if (beaconShares <= 0) { +// assertEq( +// beaconSharesBefore, +// beaconSharesAfter, +// "operator beaconchain shares should not have increased with negative shares" +// ); +// } else { +// assertEq( +// beaconSharesBefore + uint256(beaconShares), +// beaconSharesAfter, +// "operator beaconchain shares not increased correctly" +// ); +// } +// assertEq(operatorSharesBefore + shares, operatorSharesAfter, "operator shares not increased correctly"); +// // check all the delegation status changes +// assertTrue(delegationManager.isDelegated(defaultStaker), "staker not delegated correctly"); +// assertEq( +// delegationManager.delegatedTo(defaultStaker), +// defaultOperator, +// "staker delegated to the wrong address" +// ); +// assertFalse(delegationManager.isOperator(defaultStaker), "staker incorrectly registered as operator"); +// // check that the staker nonce incremented appropriately +// assertEq( +// delegationManager.stakerNonce(defaultStaker), +// currentStakerNonce + 1, +// "staker nonce did not increment" +// ); +// // verify that the salt is still marked as unused (since it wasn't checked or used) +// assertFalse( +// delegationManager.delegationApproverSaltIsSpent( +// delegationManager.delegationApprover(defaultOperator), +// emptySalt +// ), +// "salt somehow spent too incorrectly?" +// ); +// } + +// /** +// * @notice `staker` becomes delegated 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 `caller` calling `DelegationManager.delegateToBySignature` +// * The function should pass *only with a valid ECDSA signature from the `delegationApprover`, OR if called by the operator or their delegationApprover themselves +// * AND with a valid `stakerSignatureAndExpiry` input +// * Properly emits a `StakerDelegated` event +// * Staker is correctly delegated after the call (i.e. correct storage update) +// * BeaconChainStrategy and StrategyManager operator shares should increase for operator +// * 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_EOAStaker_OperatorWhoRequiresECDSASignature( +// address caller, +// bytes32 salt, +// uint256 expiry, +// int256 beaconShares, +// uint256 shares +// ) public filterFuzzedAddressInputs(caller) { +// // filter to only valid `expiry` values +// cheats.assume(expiry >= block.timestamp); +// cheats.assume(shares > 0); + +// _registerOperatorWithDelegationApprover(defaultOperator); + +// // verify that the salt hasn't been used before +// assertFalse( +// delegationManager.delegationApproverSaltIsSpent( +// delegationManager.delegationApprover(defaultOperator), +// salt +// ), +// "salt somehow spent too early?" +// ); +// { +// // Set staker shares in BeaconChainStrategy and StrategyMananger +// IStrategy[] memory strategiesToReturn = new IStrategy[](1); +// strategiesToReturn[0] = strategyMock; +// uint256[] memory sharesToReturn = new uint256[](1); +// sharesToReturn[0] = shares; +// strategyManagerMock.setDeposits(defaultStaker, strategiesToReturn, sharesToReturn); +// eigenPodManagerMock.setPodOwnerShares(defaultStaker, beaconShares); +// } + +// uint256 operatorSharesBefore = delegationManager.operatorShares(defaultOperator, strategyMock); +// uint256 beaconSharesBefore = delegationManager.operatorShares(defaultStaker, beaconChainETHStrategy); +// // fetch the staker's current nonce +// uint256 currentStakerNonce = delegationManager.stakerNonce(defaultStaker); +// // calculate the staker signature +// ISignatureUtils.SignatureWithExpiry memory stakerSignatureAndExpiry = _getStakerSignature( +// stakerPrivateKey, +// defaultOperator, +// expiry +// ); + +// // delegate from the `staker` to the operator, via having the `caller` call `DelegationManager.delegateToBySignature` +// cheats.expectEmit(true, true, true, true, address(delegationManager)); +// emit StakerDelegated(defaultStaker, defaultOperator); +// cheats.expectEmit(true, true, true, true, address(delegationManager)); +// emit OperatorSharesIncreased(defaultOperator, defaultStaker, strategyMock, shares); +// if (beaconShares > 0) { +// cheats.expectEmit(true, true, true, true, address(delegationManager)); +// emit OperatorSharesIncreased(defaultOperator, defaultStaker, beaconChainETHStrategy, uint256(beaconShares)); +// } +// _delegateToBySignatureOperatorWhoRequiresSig( +// defaultStaker, +// caller, +// defaultOperator, +// stakerSignatureAndExpiry, +// salt +// ); +// { +// // Check operator shares increases +// uint256 operatorSharesAfter = delegationManager.operatorShares(defaultOperator, strategyMock); +// uint256 beaconSharesAfter = delegationManager.operatorShares(defaultOperator, beaconChainETHStrategy); +// if (beaconShares <= 0) { +// assertEq( +// beaconSharesBefore, +// beaconSharesAfter, +// "operator beaconchain shares should not have increased with negative shares" +// ); +// } else { +// assertEq( +// beaconSharesBefore + uint256(beaconShares), +// beaconSharesAfter, +// "operator beaconchain shares not increased correctly" +// ); +// } +// assertEq(operatorSharesBefore + shares, operatorSharesAfter, "operator shares not increased correctly"); +// } +// assertTrue(delegationManager.isDelegated(defaultStaker), "staker not delegated correctly"); +// assertEq( +// delegationManager.delegatedTo(defaultStaker), +// defaultOperator, +// "staker delegated to the wrong address" +// ); +// assertFalse(delegationManager.isOperator(defaultStaker), "staker incorrectly registered as operator"); + +// // check that the delegationApprover nonce incremented appropriately +// if (caller == defaultOperator || caller == delegationManager.delegationApprover(defaultOperator)) { +// // verify that the salt is still marked as unused (since it wasn't checked or used) +// assertFalse( +// delegationManager.delegationApproverSaltIsSpent( +// delegationManager.delegationApprover(defaultOperator), +// salt +// ), +// "salt somehow spent too incorrectly?" +// ); +// } else { +// // verify that the salt is marked as used +// assertTrue( +// delegationManager.delegationApproverSaltIsSpent( +// delegationManager.delegationApprover(defaultOperator), +// salt +// ), +// "salt somehow spent not spent?" +// ); +// } + +// // check that the staker nonce incremented appropriately +// assertEq( +// delegationManager.stakerNonce(defaultStaker), +// currentStakerNonce + 1, +// "staker nonce did not increment" +// ); +// } + +// /** +// * @notice `staker` becomes delegated to an operatorwho 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 `caller` calling `DelegationManager.delegateToBySignature` +// * 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 +// * AND with a valid `stakerSignatureAndExpiry` input +// * 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_EOAStaker_OperatorWhoRequiresEIP1271Signature( +// address caller, +// bytes32 salt, +// uint256 expiry, +// int256 beaconShares, +// uint256 shares +// ) public filterFuzzedAddressInputs(caller) { +// cheats.assume(expiry >= block.timestamp); +// cheats.assume(shares > 0); + +// _registerOperatorWith1271DelegationApprover(defaultOperator); + +// // verify that the salt hasn't been used before +// assertFalse( +// delegationManager.delegationApproverSaltIsSpent( +// delegationManager.delegationApprover(defaultOperator), +// salt +// ), +// "salt somehow spent too early?" +// ); +// { +// // Set staker shares in BeaconChainStrategy and StrategyMananger +// IStrategy[] memory strategiesToReturn = new IStrategy[](1); +// strategiesToReturn[0] = strategyMock; +// uint256[] memory sharesToReturn = new uint256[](1); +// sharesToReturn[0] = shares; +// strategyManagerMock.setDeposits(defaultStaker, strategiesToReturn, sharesToReturn); +// eigenPodManagerMock.setPodOwnerShares(defaultStaker, beaconShares); +// } + +// uint256 operatorSharesBefore = delegationManager.operatorShares(defaultOperator, strategyMock); +// uint256 beaconSharesBefore = delegationManager.operatorShares(defaultStaker, beaconChainETHStrategy); +// // fetch the staker's current nonce +// uint256 currentStakerNonce = delegationManager.stakerNonce(defaultStaker); +// // calculate the staker signature +// ISignatureUtils.SignatureWithExpiry memory stakerSignatureAndExpiry = _getStakerSignature( +// stakerPrivateKey, +// defaultOperator, +// expiry +// ); + +// // delegate from the `staker` to the operator, via having the `caller` call `DelegationManager.delegateToBySignature` +// cheats.expectEmit(true, true, true, true, address(delegationManager)); +// emit StakerDelegated(defaultStaker, defaultOperator); +// cheats.expectEmit(true, true, true, true, address(delegationManager)); +// emit OperatorSharesIncreased(defaultOperator, defaultStaker, strategyMock, shares); +// if (beaconShares > 0) { +// cheats.expectEmit(true, true, true, true, address(delegationManager)); +// emit OperatorSharesIncreased(defaultOperator, defaultStaker, beaconChainETHStrategy, uint256(beaconShares)); +// } +// _delegateToBySignatureOperatorWhoRequiresSig( +// defaultStaker, +// caller, +// defaultOperator, +// stakerSignatureAndExpiry, +// salt +// ); + +// { +// // Check operator shares increases +// uint256 operatorSharesAfter = delegationManager.operatorShares(defaultOperator, strategyMock); +// uint256 beaconSharesAfter = delegationManager.operatorShares(defaultOperator, beaconChainETHStrategy); +// if (beaconShares <= 0) { +// assertEq( +// beaconSharesBefore, +// beaconSharesAfter, +// "operator beaconchain shares should not have increased with negative shares" +// ); +// } else { +// assertEq( +// beaconSharesBefore + uint256(beaconShares), +// beaconSharesAfter, +// "operator beaconchain shares not increased correctly" +// ); +// } +// assertEq(operatorSharesBefore + shares, operatorSharesAfter, "operator shares not increased correctly"); +// } +// assertTrue(delegationManager.isDelegated(defaultStaker), "staker not delegated correctly"); +// assertEq( +// delegationManager.delegatedTo(defaultStaker), +// defaultOperator, +// "staker delegated to the wrong address" +// ); +// assertFalse(delegationManager.isOperator(defaultStaker), "staker incorrectly registered as operator"); + +// // check that the delegationApprover nonce incremented appropriately +// if (caller == defaultOperator || caller == delegationManager.delegationApprover(defaultOperator)) { +// // verify that the salt is still marked as unused (since it wasn't checked or used) +// assertFalse( +// delegationManager.delegationApproverSaltIsSpent( +// delegationManager.delegationApprover(defaultOperator), +// salt +// ), +// "salt somehow spent too incorrectly?" +// ); +// } else { +// // verify that the salt is marked as used +// assertTrue( +// delegationManager.delegationApproverSaltIsSpent( +// delegationManager.delegationApprover(defaultOperator), +// salt +// ), +// "salt somehow spent not spent?" +// ); +// } + +// // check that the staker nonce incremented appropriately +// assertEq( +// delegationManager.stakerNonce(defaultStaker), +// currentStakerNonce + 1, +// "staker nonce did not increment" +// ); +// } + +// /** +// * @notice Calls same delegateToBySignature test but with the staker address being a ERC1271WalletMock +// * Generates valid signatures from the staker to delegate to operator `defaultOperator` +// */ +// function testFuzz_ERC1271Staker_OperatorWhoAcceptsAllStakers( +// address caller, +// uint256 expiry, +// int256 beaconShares, +// uint256 shares +// ) public filterFuzzedAddressInputs(caller) { +// defaultStaker = address(ERC1271WalletMock(cheats.addr(stakerPrivateKey))); +// testFuzz_EOAStaker_OperatorWhoAcceptsAllStakers(caller, expiry, beaconShares, shares); +// } + +// /** +// * @notice Calls same delegateToBySignature test but with the staker address being a ERC1271WalletMock +// * Generates valid signatures from the staker to delegate to operator `defaultOperator` who has +// * a delegationApprover address set to a nonzero EOA +// */ +// function testFuzz_ERC1271Staker_OperatorWhoRequiresECDSASignature( +// address caller, +// bytes32 salt, +// uint256 expiry, +// int256 beaconShares, +// uint256 shares +// ) public filterFuzzedAddressInputs(caller) { +// // Call same test but with the staker address being a ERC1271WalletMock +// defaultStaker = address(ERC1271WalletMock(cheats.addr(stakerPrivateKey))); +// testFuzz_EOAStaker_OperatorWhoRequiresECDSASignature(caller, salt, expiry, beaconShares, shares); +// } + +// /** +// * @notice Calls same delegateToBySignature test but with the staker address being a ERC1271WalletMock +// * Generates valid signatures from the staker to delegate to operator `defaultOperator` who has +// * a delegationApprover address set to a nonzero ERC1271 compliant contract +// */ +// function testFuzz_ERC1271Staker_OperatorWhoRequiresEIP1271Signature( +// address caller, +// bytes32 salt, +// uint256 expiry, +// int256 beaconShares, +// uint256 shares +// ) public filterFuzzedAddressInputs(caller) { +// // Call same test but with the staker address being a ERC1271WalletMock +// defaultStaker = address(ERC1271WalletMock(cheats.addr(stakerPrivateKey))); +// testFuzz_EOAStaker_OperatorWhoRequiresEIP1271Signature(caller, salt, expiry, beaconShares, shares); +// } +// } + +// contract DelegationManagerUnitTests_ShareAdjustment is DelegationManagerUnitTests { +// // @notice Verifies that `DelegationManager.increaseDelegatedScaledShares` reverts if not called by the StrategyManager nor EigenPodManager +// function testFuzz_increaseDelegatedScaledShares_revert_invalidCaller( +// address invalidCaller, +// uint256 shares +// ) public filterFuzzedAddressInputs(invalidCaller) { +// cheats.assume(invalidCaller != address(strategyManagerMock)); +// cheats.assume(invalidCaller != address(eigenPodManagerMock)); +// cheats.assume(invalidCaller != address(eigenLayerProxyAdmin)); + +// cheats.expectRevert("DelegationManager: onlyStrategyManagerOrEigenPodManager"); +// delegationManager.increaseDelegatedScaledShares(invalidCaller, strategyMock, shares); +// } + +// // @notice Verifies that there is no change in shares if the staker is not delegated +// function testFuzz_increaseDelegatedScaledShares_noop(address staker) public { +// cheats.assume(staker != defaultOperator); +// _registerOperatorWithBaseDetails(defaultOperator); +// assertFalse(delegationManager.isDelegated(staker), "bad test setup"); + +// cheats.prank(address(strategyManagerMock)); +// delegationManager.increaseDelegatedScaledShares(staker, strategyMock, 1); +// assertEq(delegationManager.operatorShares(defaultOperator, strategyMock), 0, "shares should not have changed"); +// } + +// /** +// * @notice Verifies that `DelegationManager.increaseDelegatedScaledShares` 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_increaseDelegatedScaledShares( +// address staker, +// uint256 shares, +// bool delegateFromStakerToOperator +// ) public filterFuzzedAddressInputs(staker) { +// // filter inputs, since delegating to the operator will fail when the staker is already registered as an operator +// cheats.assume(staker != defaultOperator); + +// // Register operator +// _registerOperatorWithBaseDetails(defaultOperator); + +// // delegate from the `staker` to the operator *if `delegateFromStakerToOperator` is 'true'* +// if (delegateFromStakerToOperator) { +// _delegateToOperatorWhoAcceptsAllStakers(staker, defaultOperator); +// } + +// uint256 _delegatedSharesBefore = delegationManager.operatorShares( +// delegationManager.delegatedTo(staker), +// strategyMock +// ); + +// if (delegationManager.isDelegated(staker)) { +// cheats.expectEmit(true, true, true, true, address(delegationManager)); +// emit OperatorSharesIncreased(defaultOperator, staker, strategyMock, shares); +// } + +// cheats.prank(address(strategyManagerMock)); +// delegationManager.increaseDelegatedScaledShares(staker, strategyMock, shares); + +// uint256 delegatedSharesAfter = delegationManager.operatorShares( +// delegationManager.delegatedTo(staker), +// strategyMock +// ); + +// if (delegationManager.isDelegated(staker)) { +// assertEq( +// delegatedSharesAfter, +// _delegatedSharesBefore + shares, +// "delegated shares did not increment correctly" +// ); +// } else { +// assertEq(delegatedSharesAfter, _delegatedSharesBefore, "delegated shares incremented incorrectly"); +// assertEq(_delegatedSharesBefore, 0, "nonzero shares delegated to zero address!"); +// } +// } + +// // @notice Verifies that `DelegationManager.decreaseDelegatedScaledShares` reverts if not called by the StrategyManager nor EigenPodManager +// function testFuzz_decreaseDelegatedScaledShares_revert_invalidCaller( +// address invalidCaller, +// uint256 shares +// ) public filterFuzzedAddressInputs(invalidCaller) { +// cheats.assume(invalidCaller != address(strategyManagerMock)); +// cheats.assume(invalidCaller != address(eigenPodManagerMock)); + +// cheats.startPrank(invalidCaller); +// cheats.expectRevert("DelegationManager: onlyStrategyManagerOrEigenPodManager"); +// delegationManager.decreaseDelegatedScaledShares(invalidCaller, strategyMock, shares); +// } + +// // @notice Verifies that there is no change in shares if the staker is not delegated +// function testFuzz_decreaseDelegatedScaledShares_noop(address staker) public { +// cheats.assume(staker != defaultOperator); +// _registerOperatorWithBaseDetails(defaultOperator); +// assertFalse(delegationManager.isDelegated(staker), "bad test setup"); + +// cheats.prank(address(strategyManagerMock)); +// delegationManager.decreaseDelegatedScaledShares(staker, strategyMock, 1); +// assertEq(delegationManager.operatorShares(defaultOperator, strategyMock), 0, "shares should not have changed"); +// } + +// /** +// * @notice Verifies that `DelegationManager.decreaseDelegatedScaledShares` properly decreases the delegated `shares` that the operator +// * who the `staker` is delegated to has in the strategies +// * @dev Checks that there is no change if the staker is not delegated +// */ +// function testFuzz_decreaseDelegatedScaledShares( +// address staker, +// IStrategy[] memory strategies, +// uint128 shares, +// bool delegateFromStakerToOperator +// ) public filterFuzzedAddressInputs(staker) { +// // sanity-filtering on fuzzed input length & staker +// cheats.assume(strategies.length <= 32); +// cheats.assume(staker != defaultOperator); + +// // Register operator +// _registerOperatorWithBaseDetails(defaultOperator); + +// // delegate from the `staker` to the operator *if `delegateFromStakerToOperator` is 'true'* +// if (delegateFromStakerToOperator) { +// _delegateToOperatorWhoAcceptsAllStakers(staker, defaultOperator); +// } + +// uint256[] memory sharesInputArray = new uint256[](strategies.length); + +// address delegatedTo = delegationManager.delegatedTo(staker); + +// // for each strategy in `strategies`, increase delegated shares by `shares` +// // noop if the staker is not delegated +// cheats.startPrank(address(strategyManagerMock)); +// for (uint256 i = 0; i < strategies.length; ++i) { +// delegationManager.increaseDelegatedScaledShares(staker, strategies[i], shares); +// // 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 +// sharesInputArray[i] = shares; +// totalSharesForStrategyInArray[address(strategies[i])] += sharesInputArray[i]; +// } +// cheats.stopPrank(); + +// bool isDelegated = delegationManager.isDelegated(staker); + +// // for each strategy in `strategies`, decrease delegated shares by `shares` +// { +// cheats.startPrank(address(strategyManagerMock)); +// address operatorToDecreaseSharesOf = delegationManager.delegatedTo(staker); +// if (isDelegated) { +// for (uint256 i = 0; i < strategies.length; ++i) { +// cheats.expectEmit(true, true, true, true, address(delegationManager)); +// emit OperatorSharesDecreased( +// operatorToDecreaseSharesOf, +// staker, +// strategies[i], +// sharesInputArray[i] +// ); +// delegationManager.decreaseDelegatedScaledShares(staker, strategies[i], sharesInputArray[i]); +// } +// } +// cheats.stopPrank(); +// } + +// // check shares after call to `decreaseDelegatedScaledShares` +// for (uint256 i = 0; i < strategies.length; ++i) { +// uint256 delegatedSharesAfter = delegationManager.operatorShares(delegatedTo, strategies[i]); + +// if (isDelegated) { +// assertEq( +// delegatedSharesAfter + totalSharesForStrategyInArray[address(strategies[i])], +// delegatedSharesBefore[strategies[i]], +// "delegated shares did not decrement correctly" +// ); +// assertEq(delegatedSharesAfter, 0, "nonzero shares delegated to"); +// } else { +// assertEq( +// delegatedSharesAfter, +// delegatedSharesBefore[strategies[i]], +// "delegated shares decremented incorrectly" +// ); +// assertEq(delegatedSharesBefore[strategies[i]], 0, "nonzero shares delegated to zero address!"); +// } +// } +// } +// } + +// contract DelegationManagerUnitTests_Undelegate is DelegationManagerUnitTests { +// // @notice Verifies that undelegating is not possible when the "undelegation paused" switch is flipped +// function test_undelegate_revert_paused(address staker) public filterFuzzedAddressInputs(staker) { +// // set the pausing flag +// cheats.prank(pauser); +// delegationManager.pause(2 ** PAUSED_ENTER_WITHDRAWAL_QUEUE); + +// cheats.prank(staker); +// cheats.expectRevert("Pausable: index is paused"); +// delegationManager.undelegate(staker); +// } + +// function testFuzz_undelegate_revert_notDelgated( +// address undelegatedStaker +// ) public filterFuzzedAddressInputs(undelegatedStaker) { +// cheats.assume(undelegatedStaker != defaultOperator); +// assertFalse(delegationManager.isDelegated(undelegatedStaker), "bad test setup"); + +// cheats.prank(undelegatedStaker); +// cheats.expectRevert("DelegationManager.undelegate: staker must be delegated to undelegate"); +// delegationManager.undelegate(undelegatedStaker); +// } + +// // @notice Verifies that an operator cannot undelegate from themself (this should always be forbidden) +// function testFuzz_undelegate_revert_stakerIsOperator(address operator) public filterFuzzedAddressInputs(operator) { +// _registerOperatorWithBaseDetails(operator); + +// cheats.prank(operator); +// cheats.expectRevert("DelegationManager.undelegate: operators cannot be undelegated"); +// delegationManager.undelegate(operator); +// } + +// /** +// * @notice verifies that `DelegationManager.undelegate` reverts if trying to undelegate an operator from themselves +// * @param callFromOperatorOrApprover -- calls from the operator if 'false' and the 'approver' if true +// */ +// function testFuzz_undelegate_operatorCannotForceUndelegateThemself( +// address delegationApprover, +// bool callFromOperatorOrApprover +// ) public filterFuzzedAddressInputs(delegationApprover) { +// // register *this contract* as an operator with the default `delegationApprover` +// _registerOperatorWithDelegationApprover(defaultOperator); + +// address caller; +// if (callFromOperatorOrApprover) { +// caller = delegationApprover; +// } else { +// caller = defaultOperator; +// } + +// // try to call the `undelegate` function and check for reversion +// cheats.prank(caller); +// cheats.expectRevert("DelegationManager.undelegate: operators cannot be undelegated"); +// delegationManager.undelegate(defaultOperator); +// } + +// //TODO: verify that this check is even needed +// function test_undelegate_revert_InputAddressZero() public { +// _registerOperatorWithBaseDetails(defaultOperator); +// _delegateToOperatorWhoAcceptsAllStakers(address(0), defaultOperator); + +// cheats.prank(address(0)); +// cheats.expectRevert("DelegationManager.undelegate: cannot undelegate zero address"); +// delegationManager.undelegate(address(0)); +// } + +// /** +// * @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_undelegate_revert_invalidCaller( +// address invalidCaller +// ) public filterFuzzedAddressInputs(invalidCaller) { +// address staker = address(0x123); +// // filter out addresses that are actually allowed to call the function +// cheats.assume(invalidCaller != staker); +// cheats.assume(invalidCaller != defaultOperator); +// cheats.assume(invalidCaller != defaultApprover); + +// _registerOperatorWithDelegationApprover(defaultOperator); +// _delegateToOperatorWhoRequiresSig(staker, defaultOperator); + +// cheats.prank(invalidCaller); +// cheats.expectRevert("DelegationManager.undelegate: caller cannot undelegate staker"); +// delegationManager.undelegate(staker); +// } + +// /** +// * 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(address staker) public filterFuzzedAddressInputs(staker) { +// cheats.assume(staker != defaultOperator); - // register *this contract* as an operator and delegate from the `staker` to them - _registerOperatorWithBaseDetails(defaultOperator); - _delegateToOperatorWhoAcceptsAllStakers(staker, defaultOperator); - - cheats.expectEmit(true, true, true, true, address(delegationManager)); - emit StakerUndelegated(staker, delegationManager.delegatedTo(staker)); - cheats.prank(staker); - bytes32[] memory withdrawalRoots = delegationManager.undelegate(staker); - - assertEq(withdrawalRoots.length, 0, "withdrawalRoot should be an empty array"); - assertEq( - delegationManager.delegatedTo(staker), - address(0), - "undelegated staker should be delegated to zero address" - ); - assertFalse(delegationManager.isDelegated(staker), "staker not undelegated"); - } - - /** - * @notice Verifies that the `undelegate` function allows for a force undelegation - */ - function testFuzz_undelegate_forceUndelegation_noDelegateableShares( - address staker, - bytes32 salt, - bool callFromOperatorOrApprover - ) public filterFuzzedAddressInputs(staker) { - cheats.assume(staker != defaultOperator); - - _registerOperatorWithDelegationApprover(defaultOperator); - _delegateToOperatorWhoRequiresSig(staker, defaultOperator, salt); - - address caller; - if (callFromOperatorOrApprover) { - caller = defaultApprover; - } else { - caller = defaultOperator; - } - - cheats.expectEmit(true, true, true, true, address(delegationManager)); - emit StakerForceUndelegated(staker, defaultOperator); - cheats.expectEmit(true, true, true, true, address(delegationManager)); - emit StakerUndelegated(staker, defaultOperator); - cheats.prank(caller); - bytes32[] memory withdrawalRoots = delegationManager.undelegate(staker); - - assertEq(withdrawalRoots.length, 0, "withdrawalRoot should be an empty array"); - assertEq( - delegationManager.delegatedTo(staker), - address(0), - "undelegated staker should be delegated to zero address" - ); - assertFalse(delegationManager.isDelegated(staker), "staker not undelegated"); - } -} - -contract DelegationManagerUnitTests_queueWithdrawals is DelegationManagerUnitTests { - function test_Revert_WhenEnterQueueWithdrawalsPaused() public { - cheats.prank(pauser); - delegationManager.pause(2 ** PAUSED_ENTER_WITHDRAWAL_QUEUE); - (IDelegationManager.QueuedWithdrawalParams[] memory queuedWithdrawalParams, , ) = _setUpQueueWithdrawalsSingleStrat({ - staker: defaultStaker, - withdrawer: defaultStaker, - strategy: strategyMock, - withdrawalAmount: 100 - }); - cheats.expectRevert("Pausable: index is paused"); - delegationManager.queueWithdrawals(queuedWithdrawalParams); - } - - function test_Revert_WhenQueueWithdrawalParamsLengthMismatch() public { - IStrategy[] memory strategyArray = new IStrategy[](1); - strategyArray[0] = strategyMock; - uint256[] memory shareAmounts = new uint256[](2); - shareAmounts[0] = 100; - shareAmounts[1] = 100; - - IDelegationManager.QueuedWithdrawalParams[] memory queuedWithdrawalParams = new IDelegationManager.QueuedWithdrawalParams[](1); - queuedWithdrawalParams[0] = IDelegationManager.QueuedWithdrawalParams({ - strategies: strategyArray, - shares: shareAmounts, - withdrawer: defaultStaker - }); - - cheats.expectRevert("DelegationManager.queueWithdrawal: input length mismatch"); - delegationManager.queueWithdrawals(queuedWithdrawalParams); - } - - function test_Revert_WhenNotStakerWithdrawer(address withdrawer) public { - cheats.assume(withdrawer != defaultStaker); - - (IDelegationManager.QueuedWithdrawalParams[] memory queuedWithdrawalParams, , ) = _setUpQueueWithdrawalsSingleStrat({ - staker: defaultStaker, - withdrawer: withdrawer, - strategy: strategyMock, - withdrawalAmount: 100 - }); - cheats.expectRevert("DelegationManager.queueWithdrawal: withdrawer must be staker"); - cheats.prank(defaultStaker); - delegationManager.queueWithdrawals(queuedWithdrawalParams); - } - - function test_Revert_WhenEmptyStrategiesArray() public { - IStrategy[] memory strategyArray = new IStrategy[](0); - uint256[] memory shareAmounts = new uint256[](0); - address withdrawer = defaultOperator; - - IDelegationManager.QueuedWithdrawalParams[] memory queuedWithdrawalParams = new IDelegationManager.QueuedWithdrawalParams[](1); - queuedWithdrawalParams[0] = IDelegationManager.QueuedWithdrawalParams({ - strategies: strategyArray, - shares: shareAmounts, - withdrawer: withdrawer - }); - - cheats.expectRevert("DelegationManager._removeSharesAndQueueWithdrawal: strategies cannot be empty"); - delegationManager.queueWithdrawals(queuedWithdrawalParams); - } - - /** - * @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( - address staker, - uint256 depositAmount, - uint256 withdrawalAmount - ) public filterFuzzedAddressInputs(staker) { - cheats.assume(staker != defaultOperator); - cheats.assume(withdrawalAmount > 0 && withdrawalAmount <= depositAmount); - uint256[] memory sharesAmounts = new uint256[](1); - sharesAmounts[0] = depositAmount; - // sharesAmounts is single element so returns single strategy - IStrategy[] memory strategies = _deployAndDepositIntoStrategies(staker, sharesAmounts); - _registerOperatorWithBaseDetails(defaultOperator); - _delegateToOperatorWhoAcceptsAllStakers(staker, defaultOperator); - ( - IDelegationManager.QueuedWithdrawalParams[] memory queuedWithdrawalParams, - IDelegationManager.Withdrawal memory withdrawal, - bytes32 withdrawalRoot - ) = _setUpQueueWithdrawalsSingleStrat({ - staker: staker, - withdrawer: staker, - strategy: strategies[0], - withdrawalAmount: withdrawalAmount - }); - assertEq(delegationManager.delegatedTo(staker), defaultOperator, "staker should be delegated to operator"); - uint256 nonceBefore = delegationManager.cumulativeWithdrawalsQueued(staker); - uint256 delegatedSharesBefore = delegationManager.operatorShares(defaultOperator, strategies[0]); - - // queueWithdrawals - cheats.prank(staker); - cheats.expectEmit(true, true, true, true, address(delegationManager)); - emit WithdrawalQueued(withdrawalRoot, withdrawal); - delegationManager.queueWithdrawals(queuedWithdrawalParams); - - uint256 nonceAfter = delegationManager.cumulativeWithdrawalsQueued(staker); - uint256 delegatedSharesAfter = delegationManager.operatorShares(defaultOperator, strategies[0]); - assertEq(nonceBefore + 1, nonceAfter, "staker nonce should have incremented"); - assertEq(delegatedSharesBefore - withdrawalAmount, delegatedSharesAfter, "delegated shares not decreased correctly"); - } - - /** - * @notice Verifies that `DelegationManager.queueWithdrawals` properly queues a withdrawal for the `withdrawer` - * with multiple strategies and sharesAmounts. Depending on length sharesAmounts, deploys corresponding number of strategies - * and deposits sharesAmounts into each strategy for the staker and delegates to operator. - * For each strategy, withdrawAmount <= depositAmount - * - 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_MultipleStrats( - address staker, - uint256[] memory depositAmounts - ) public filterFuzzedAddressInputs(staker){ - cheats.assume(staker != defaultOperator); - cheats.assume(depositAmounts.length > 0 && depositAmounts.length <= 32); - uint256[] memory withdrawalAmounts = _fuzzWithdrawalAmounts(depositAmounts); - - IStrategy[] memory strategies = _deployAndDepositIntoStrategies(staker, depositAmounts); - _registerOperatorWithBaseDetails(defaultOperator); - _delegateToOperatorWhoAcceptsAllStakers(staker, defaultOperator); - ( - IDelegationManager.QueuedWithdrawalParams[] memory queuedWithdrawalParams, - IDelegationManager.Withdrawal memory withdrawal, - bytes32 withdrawalRoot - ) = _setUpQueueWithdrawals({ - staker: staker, - withdrawer: staker, - strategies: strategies, - withdrawalAmounts: withdrawalAmounts - }); - // Before queueWithdrawal state values - uint256 nonceBefore = delegationManager.cumulativeWithdrawalsQueued(staker); - assertEq(delegationManager.delegatedTo(staker), defaultOperator, "staker should be delegated to operator"); - uint256[] memory delegatedSharesBefore = new uint256[](strategies.length); - for (uint256 i = 0; i < strategies.length; i++) { - delegatedSharesBefore[i] = delegationManager.operatorShares(defaultOperator, strategies[i]); - } - - // queueWithdrawals - cheats.prank(staker); - cheats.expectEmit(true, true, true, true, address(delegationManager)); - emit WithdrawalQueued(withdrawalRoot, withdrawal); - delegationManager.queueWithdrawals(queuedWithdrawalParams); - - // Post queueWithdrawal state values - for (uint256 i = 0; i < strategies.length; i++) { - assertEq( - delegatedSharesBefore[i] - withdrawalAmounts[i], // Shares before - withdrawal amount - delegationManager.operatorShares(defaultOperator, strategies[i]), // Shares after - "delegated shares not decreased correctly" - ); - } - uint256 nonceAfter = delegationManager.cumulativeWithdrawalsQueued(staker); - assertEq(nonceBefore + 1, nonceAfter, "staker nonce should have incremented"); - } - - /** - * @notice Verifies that `DelegationManager.queueWithdrawals` properly queues a withdrawal for the `withdrawer` - * with multiple strategies and sharesAmounts and with thirdPartyTransfersForbidden for one of the strategies. - * Queuing a withdrawal should pass as the `withdrawer` address is the same as the staker. - * - * Depending on length sharesAmounts, deploys corresponding number of strategies - * and deposits sharesAmounts into each strategy for the staker and delegates to operator. - * For each strategy, withdrawAmount <= depositAmount - * - 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_ThirdPartyTransfersForbidden( - address staker, - uint256[] memory depositAmounts, - uint256 randSalt - ) public filterFuzzedAddressInputs(staker){ - cheats.assume(depositAmounts.length > 0 && depositAmounts.length <= 32); - cheats.assume(staker != defaultOperator); - uint256[] memory withdrawalAmounts = _fuzzWithdrawalAmounts(depositAmounts); - - IStrategy[] memory strategies = _deployAndDepositIntoStrategies(staker, depositAmounts); - // Randomly set strategy true for thirdPartyTransfersForbidden - uint256 randStrategyIndex = randSalt % strategies.length; - strategyManagerMock.setThirdPartyTransfersForbidden(strategies[randStrategyIndex], true); - - _registerOperatorWithBaseDetails(defaultOperator); - _delegateToOperatorWhoAcceptsAllStakers(staker, defaultOperator); - ( - IDelegationManager.QueuedWithdrawalParams[] memory queuedWithdrawalParams, - IDelegationManager.Withdrawal memory withdrawal, - bytes32 withdrawalRoot - ) = _setUpQueueWithdrawals({ - staker: staker, - withdrawer: staker, - strategies: strategies, - withdrawalAmounts: withdrawalAmounts - }); - // Before queueWithdrawal state values - uint256 nonceBefore = delegationManager.cumulativeWithdrawalsQueued(staker); - assertEq(delegationManager.delegatedTo(staker), defaultOperator, "staker should be delegated to operator"); - uint256[] memory delegatedSharesBefore = new uint256[](strategies.length); - for (uint256 i = 0; i < strategies.length; i++) { - delegatedSharesBefore[i] = delegationManager.operatorShares(defaultOperator, strategies[i]); - } - - // queueWithdrawals - cheats.prank(staker); - cheats.expectEmit(true, true, true, true, address(delegationManager)); - emit WithdrawalQueued(withdrawalRoot, withdrawal); - delegationManager.queueWithdrawals(queuedWithdrawalParams); - - // Post queueWithdrawal state values - for (uint256 i = 0; i < strategies.length; i++) { - assertEq( - delegatedSharesBefore[i] - withdrawalAmounts[i], // Shares before - withdrawal amount - delegationManager.operatorShares(defaultOperator, strategies[i]), // Shares after - "delegated shares not decreased correctly" - ); - } - uint256 nonceAfter = delegationManager.cumulativeWithdrawalsQueued(staker); - assertEq(nonceBefore + 1, nonceAfter, "staker nonce should have incremented"); - } - - /** - * @notice Randomly selects one of the strategies to set thirdPartyTransfersForbidden to true. - * Verifies that `DelegationManager.queueWithdrawals` properly reverts a queuedWithdrawal since the `withdrawer` - * is not the same as the `staker`. - */ - function testFuzz_queueWithdrawal_Revert_WhenThirdPartyTransfersForbidden( - address staker, - address withdrawer, - uint256[] memory depositAmounts, - uint256 randSalt - ) public filterFuzzedAddressInputs(staker) { - cheats.assume(staker != withdrawer && staker != defaultOperator); - cheats.assume(depositAmounts.length > 0 && depositAmounts.length <= 32); - uint256[] memory withdrawalAmounts = _fuzzWithdrawalAmounts(depositAmounts); - - IStrategy[] memory strategies = _deployAndDepositIntoStrategies(staker, depositAmounts); - // Randomly set strategy true for thirdPartyTransfersForbidden - uint256 randStrategyIndex = randSalt % strategies.length; - strategyManagerMock.setThirdPartyTransfersForbidden(strategies[randStrategyIndex], true); - _registerOperatorWithBaseDetails(defaultOperator); - _delegateToOperatorWhoAcceptsAllStakers(staker, defaultOperator); - (IDelegationManager.QueuedWithdrawalParams[] memory queuedWithdrawalParams, , ) = _setUpQueueWithdrawals({ - staker: staker, - withdrawer: withdrawer, - strategies: strategies, - withdrawalAmounts: withdrawalAmounts - }); - - // queueWithdrawals - // NOTE: Originally, you could queue a withdrawal to a different address, which would fail with a specific error - // if third party transfers were forbidden. Now, withdrawing to a different address is forbidden regardless - // of third party transfer status. - cheats.expectRevert( - "DelegationManager.queueWithdrawal: withdrawer must be staker" - ); - cheats.prank(staker); - delegationManager.queueWithdrawals(queuedWithdrawalParams); - } -} - -contract DelegationManagerUnitTests_completeQueuedWithdrawal is DelegationManagerUnitTests { - function test_Revert_WhenExitWithdrawalQueuePaused() public { - cheats.prank(pauser); - delegationManager.pause(2 ** PAUSED_EXIT_WITHDRAWAL_QUEUE); - _registerOperatorWithBaseDetails(defaultOperator); - ( - IDelegationManager.Withdrawal memory withdrawal, - IERC20[] memory tokens, - /* bytes32 withdrawalRoot */ - ) = _setUpCompleteQueuedWithdrawalSingleStrat({ - staker: defaultStaker, - withdrawer: defaultStaker, - depositAmount: 100, - withdrawalAmount: 100 - }); - _delegateToOperatorWhoAcceptsAllStakers(defaultStaker, defaultOperator); - - cheats.expectRevert("Pausable: index is paused"); - delegationManager.completeQueuedWithdrawal(withdrawal, tokens, 0 /* middlewareTimesIndex */, false); - } - - function test_Revert_WhenInvalidWithdrawalRoot() public { - _registerOperatorWithBaseDetails(defaultOperator); - ( - IDelegationManager.Withdrawal memory withdrawal, - IERC20[] memory tokens, - bytes32 withdrawalRoot - ) = _setUpCompleteQueuedWithdrawalSingleStrat({ - staker: defaultStaker, - withdrawer: defaultStaker, - depositAmount: 100, - withdrawalAmount: 100 - }); - _delegateToOperatorWhoAcceptsAllStakers(defaultStaker, defaultOperator); - - assertTrue(delegationManager.pendingWithdrawals(withdrawalRoot), "withdrawalRoot should be pending"); - cheats.roll(block.number + delegationManager.getWithdrawalDelay(withdrawal.strategies)); - cheats.prank(defaultStaker); - delegationManager.completeQueuedWithdrawal(withdrawal, tokens, 0 /* middlewareTimesIndex */, false); - assertFalse(delegationManager.pendingWithdrawals(withdrawalRoot), "withdrawalRoot should be completed and marked false now"); - - cheats.roll(block.number + delegationManager.getWithdrawalDelay(withdrawal.strategies)); - cheats.expectRevert("DelegationManager._completeQueuedWithdrawal: action is not in queue"); - cheats.prank(defaultStaker); - delegationManager.completeQueuedWithdrawal(withdrawal, tokens, 0 /* middlewareTimesIndex */, false); - } - - /** - * @notice should revert if minWithdrawalDelayBlocks has not passed, and if - * delegationManager.getWithdrawalDelay returns a value greater than minWithdrawalDelayBlocks - * then it should revert if the validBlockNumber has not passed either. - */ - function test_Revert_WhenWithdrawalDelayBlocksNotPassed( - uint256[] memory depositAmounts, - bool receiveAsTokens - ) public { - cheats.assume(depositAmounts.length > 0 && depositAmounts.length <= 32); - uint256[] memory withdrawalAmounts = _fuzzWithdrawalAmounts(depositAmounts); +// // register *this contract* as an operator and delegate from the `staker` to them +// _registerOperatorWithBaseDetails(defaultOperator); +// _delegateToOperatorWhoAcceptsAllStakers(staker, defaultOperator); + +// cheats.expectEmit(true, true, true, true, address(delegationManager)); +// emit StakerUndelegated(staker, delegationManager.delegatedTo(staker)); +// cheats.prank(staker); +// bytes32[] memory withdrawalRoots = delegationManager.undelegate(staker); + +// assertEq(withdrawalRoots.length, 0, "withdrawalRoot should be an empty array"); +// assertEq( +// delegationManager.delegatedTo(staker), +// address(0), +// "undelegated staker should be delegated to zero address" +// ); +// assertFalse(delegationManager.isDelegated(staker), "staker not undelegated"); +// } + +// /** +// * @notice Verifies that the `undelegate` function allows for a force undelegation +// */ +// function testFuzz_undelegate_forceUndelegation_noDelegateableShares( +// address staker, +// bytes32 salt, +// bool callFromOperatorOrApprover +// ) public filterFuzzedAddressInputs(staker) { +// cheats.assume(staker != defaultOperator); + +// _registerOperatorWithDelegationApprover(defaultOperator); +// _delegateToOperatorWhoRequiresSig(staker, defaultOperator, salt); + +// address caller; +// if (callFromOperatorOrApprover) { +// caller = defaultApprover; +// } else { +// caller = defaultOperator; +// } + +// cheats.expectEmit(true, true, true, true, address(delegationManager)); +// emit StakerForceUndelegated(staker, defaultOperator); +// cheats.expectEmit(true, true, true, true, address(delegationManager)); +// emit StakerUndelegated(staker, defaultOperator); +// cheats.prank(caller); +// bytes32[] memory withdrawalRoots = delegationManager.undelegate(staker); + +// assertEq(withdrawalRoots.length, 0, "withdrawalRoot should be an empty array"); +// assertEq( +// delegationManager.delegatedTo(staker), +// address(0), +// "undelegated staker should be delegated to zero address" +// ); +// assertFalse(delegationManager.isDelegated(staker), "staker not undelegated"); +// } +// } + +// contract DelegationManagerUnitTests_queueWithdrawals is DelegationManagerUnitTests { +// function test_Revert_WhenEnterQueueWithdrawalsPaused() public { +// cheats.prank(pauser); +// delegationManager.pause(2 ** PAUSED_ENTER_WITHDRAWAL_QUEUE); +// (IDelegationManager.QueuedWithdrawalParams[] memory queuedWithdrawalParams, , ) = _setUpQueueWithdrawalsSingleStrat({ +// staker: defaultStaker, +// withdrawer: defaultStaker, +// strategy: strategyMock, +// withdrawalAmount: 100 +// }); +// cheats.expectRevert("Pausable: index is paused"); +// delegationManager.queueWithdrawals(queuedWithdrawalParams); +// } + +// function test_Revert_WhenQueueWithdrawalParamsLengthMismatch() public { +// IStrategy[] memory strategyArray = new IStrategy[](1); +// strategyArray[0] = strategyMock; +// uint256[] memory shareAmounts = new uint256[](2); +// shareAmounts[0] = 100; +// shareAmounts[1] = 100; + +// IDelegationManager.QueuedWithdrawalParams[] memory queuedWithdrawalParams = new IDelegationManager.QueuedWithdrawalParams[](1); +// queuedWithdrawalParams[0] = IDelegationManager.QueuedWithdrawalParams({ +// strategies: strategyArray, +// shares: shareAmounts, +// withdrawer: defaultStaker +// }); + +// cheats.expectRevert("DelegationManager.queueWithdrawal: input length mismatch"); +// delegationManager.queueWithdrawals(queuedWithdrawalParams); +// } + +// function test_Revert_WhenNotStakerWithdrawer(address withdrawer) public { +// cheats.assume(withdrawer != defaultStaker); + +// (IDelegationManager.QueuedWithdrawalParams[] memory queuedWithdrawalParams, , ) = _setUpQueueWithdrawalsSingleStrat({ +// staker: defaultStaker, +// withdrawer: withdrawer, +// strategy: strategyMock, +// withdrawalAmount: 100 +// }); +// cheats.expectRevert("DelegationManager.queueWithdrawal: withdrawer must be staker"); +// cheats.prank(defaultStaker); +// delegationManager.queueWithdrawals(queuedWithdrawalParams); +// } + +// function test_Revert_WhenEmptyStrategiesArray() public { +// IStrategy[] memory strategyArray = new IStrategy[](0); +// uint256[] memory shareAmounts = new uint256[](0); +// address withdrawer = defaultOperator; + +// IDelegationManager.QueuedWithdrawalParams[] memory queuedWithdrawalParams = new IDelegationManager.QueuedWithdrawalParams[](1); +// queuedWithdrawalParams[0] = IDelegationManager.QueuedWithdrawalParams({ +// strategies: strategyArray, +// shares: shareAmounts, +// withdrawer: withdrawer +// }); + +// cheats.expectRevert("DelegationManager._removeSharesAndQueueWithdrawal: strategies cannot be empty"); +// delegationManager.queueWithdrawals(queuedWithdrawalParams); +// } + +// /** +// * @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( +// address staker, +// uint256 depositAmount, +// uint256 withdrawalAmount +// ) public filterFuzzedAddressInputs(staker) { +// cheats.assume(staker != defaultOperator); +// cheats.assume(withdrawalAmount > 0 && withdrawalAmount <= depositAmount); +// uint256[] memory sharesAmounts = new uint256[](1); +// sharesAmounts[0] = depositAmount; +// // sharesAmounts is single element so returns single strategy +// IStrategy[] memory strategies = _deployAndDepositIntoStrategies(staker, sharesAmounts); +// _registerOperatorWithBaseDetails(defaultOperator); +// _delegateToOperatorWhoAcceptsAllStakers(staker, defaultOperator); +// ( +// IDelegationManager.QueuedWithdrawalParams[] memory queuedWithdrawalParams, +// IDelegationManager.Withdrawal memory withdrawal, +// bytes32 withdrawalRoot +// ) = _setUpQueueWithdrawalsSingleStrat({ +// staker: staker, +// withdrawer: staker, +// strategy: strategies[0], +// withdrawalAmount: withdrawalAmount +// }); +// assertEq(delegationManager.delegatedTo(staker), defaultOperator, "staker should be delegated to operator"); +// uint256 nonceBefore = delegationManager.cumulativeWithdrawalsQueued(staker); +// uint256 delegatedSharesBefore = delegationManager.operatorShares(defaultOperator, strategies[0]); + +// // queueWithdrawals +// cheats.prank(staker); +// cheats.expectEmit(true, true, true, true, address(delegationManager)); +// emit WithdrawalQueued(withdrawalRoot, withdrawal); +// delegationManager.queueWithdrawals(queuedWithdrawalParams); + +// uint256 nonceAfter = delegationManager.cumulativeWithdrawalsQueued(staker); +// uint256 delegatedSharesAfter = delegationManager.operatorShares(defaultOperator, strategies[0]); +// assertEq(nonceBefore + 1, nonceAfter, "staker nonce should have incremented"); +// assertEq(delegatedSharesBefore - withdrawalAmount, delegatedSharesAfter, "delegated shares not decreased correctly"); +// } + +// /** +// * @notice Verifies that `DelegationManager.queueWithdrawals` properly queues a withdrawal for the `withdrawer` +// * with multiple strategies and sharesAmounts. Depending on length sharesAmounts, deploys corresponding number of strategies +// * and deposits sharesAmounts into each strategy for the staker and delegates to operator. +// * For each strategy, withdrawAmount <= depositAmount +// * - 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_MultipleStrats( +// address staker, +// uint256[] memory depositAmounts +// ) public filterFuzzedAddressInputs(staker){ +// cheats.assume(staker != defaultOperator); +// cheats.assume(depositAmounts.length > 0 && depositAmounts.length <= 32); +// uint256[] memory withdrawalAmounts = _fuzzWithdrawalAmounts(depositAmounts); + +// IStrategy[] memory strategies = _deployAndDepositIntoStrategies(staker, depositAmounts); +// _registerOperatorWithBaseDetails(defaultOperator); +// _delegateToOperatorWhoAcceptsAllStakers(staker, defaultOperator); +// ( +// IDelegationManager.QueuedWithdrawalParams[] memory queuedWithdrawalParams, +// IDelegationManager.Withdrawal memory withdrawal, +// bytes32 withdrawalRoot +// ) = _setUpQueueWithdrawals({ +// staker: staker, +// withdrawer: staker, +// strategies: strategies, +// withdrawalAmounts: withdrawalAmounts +// }); +// // Before queueWithdrawal state values +// uint256 nonceBefore = delegationManager.cumulativeWithdrawalsQueued(staker); +// assertEq(delegationManager.delegatedTo(staker), defaultOperator, "staker should be delegated to operator"); +// uint256[] memory delegatedSharesBefore = new uint256[](strategies.length); +// for (uint256 i = 0; i < strategies.length; i++) { +// delegatedSharesBefore[i] = delegationManager.operatorShares(defaultOperator, strategies[i]); +// } + +// // queueWithdrawals +// cheats.prank(staker); +// cheats.expectEmit(true, true, true, true, address(delegationManager)); +// emit WithdrawalQueued(withdrawalRoot, withdrawal); +// delegationManager.queueWithdrawals(queuedWithdrawalParams); + +// // Post queueWithdrawal state values +// for (uint256 i = 0; i < strategies.length; i++) { +// assertEq( +// delegatedSharesBefore[i] - withdrawalAmounts[i], // Shares before - withdrawal amount +// delegationManager.operatorShares(defaultOperator, strategies[i]), // Shares after +// "delegated shares not decreased correctly" +// ); +// } +// uint256 nonceAfter = delegationManager.cumulativeWithdrawalsQueued(staker); +// assertEq(nonceBefore + 1, nonceAfter, "staker nonce should have incremented"); +// } + +// /** +// * @notice Verifies that `DelegationManager.queueWithdrawals` properly queues a withdrawal for the `withdrawer` +// * with multiple strategies and sharesAmounts and with thirdPartyTransfersForbidden for one of the strategies. +// * Queuing a withdrawal should pass as the `withdrawer` address is the same as the staker. +// * +// * Depending on length sharesAmounts, deploys corresponding number of strategies +// * and deposits sharesAmounts into each strategy for the staker and delegates to operator. +// * For each strategy, withdrawAmount <= depositAmount +// * - 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_ThirdPartyTransfersForbidden( +// address staker, +// uint256[] memory depositAmounts, +// uint256 randSalt +// ) public filterFuzzedAddressInputs(staker){ +// cheats.assume(depositAmounts.length > 0 && depositAmounts.length <= 32); +// cheats.assume(staker != defaultOperator); +// uint256[] memory withdrawalAmounts = _fuzzWithdrawalAmounts(depositAmounts); + +// IStrategy[] memory strategies = _deployAndDepositIntoStrategies(staker, depositAmounts); +// // Randomly set strategy true for thirdPartyTransfersForbidden +// uint256 randStrategyIndex = randSalt % strategies.length; +// strategyManagerMock.setThirdPartyTransfersForbidden(strategies[randStrategyIndex], true); + +// _registerOperatorWithBaseDetails(defaultOperator); +// _delegateToOperatorWhoAcceptsAllStakers(staker, defaultOperator); +// ( +// IDelegationManager.QueuedWithdrawalParams[] memory queuedWithdrawalParams, +// IDelegationManager.Withdrawal memory withdrawal, +// bytes32 withdrawalRoot +// ) = _setUpQueueWithdrawals({ +// staker: staker, +// withdrawer: staker, +// strategies: strategies, +// withdrawalAmounts: withdrawalAmounts +// }); +// // Before queueWithdrawal state values +// uint256 nonceBefore = delegationManager.cumulativeWithdrawalsQueued(staker); +// assertEq(delegationManager.delegatedTo(staker), defaultOperator, "staker should be delegated to operator"); +// uint256[] memory delegatedSharesBefore = new uint256[](strategies.length); +// for (uint256 i = 0; i < strategies.length; i++) { +// delegatedSharesBefore[i] = delegationManager.operatorShares(defaultOperator, strategies[i]); +// } + +// // queueWithdrawals +// cheats.prank(staker); +// cheats.expectEmit(true, true, true, true, address(delegationManager)); +// emit WithdrawalQueued(withdrawalRoot, withdrawal); +// delegationManager.queueWithdrawals(queuedWithdrawalParams); + +// // Post queueWithdrawal state values +// for (uint256 i = 0; i < strategies.length; i++) { +// assertEq( +// delegatedSharesBefore[i] - withdrawalAmounts[i], // Shares before - withdrawal amount +// delegationManager.operatorShares(defaultOperator, strategies[i]), // Shares after +// "delegated shares not decreased correctly" +// ); +// } +// uint256 nonceAfter = delegationManager.cumulativeWithdrawalsQueued(staker); +// assertEq(nonceBefore + 1, nonceAfter, "staker nonce should have incremented"); +// } + +// /** +// * @notice Randomly selects one of the strategies to set thirdPartyTransfersForbidden to true. +// * Verifies that `DelegationManager.queueWithdrawals` properly reverts a queuedWithdrawal since the `withdrawer` +// * is not the same as the `staker`. +// */ +// function testFuzz_queueWithdrawal_Revert_WhenThirdPartyTransfersForbidden( +// address staker, +// address withdrawer, +// uint256[] memory depositAmounts, +// uint256 randSalt +// ) public filterFuzzedAddressInputs(staker) { +// cheats.assume(staker != withdrawer && staker != defaultOperator); +// cheats.assume(depositAmounts.length > 0 && depositAmounts.length <= 32); +// uint256[] memory withdrawalAmounts = _fuzzWithdrawalAmounts(depositAmounts); + +// IStrategy[] memory strategies = _deployAndDepositIntoStrategies(staker, depositAmounts); +// // Randomly set strategy true for thirdPartyTransfersForbidden +// uint256 randStrategyIndex = randSalt % strategies.length; +// strategyManagerMock.setThirdPartyTransfersForbidden(strategies[randStrategyIndex], true); +// _registerOperatorWithBaseDetails(defaultOperator); +// _delegateToOperatorWhoAcceptsAllStakers(staker, defaultOperator); +// (IDelegationManager.QueuedWithdrawalParams[] memory queuedWithdrawalParams, , ) = _setUpQueueWithdrawals({ +// staker: staker, +// withdrawer: withdrawer, +// strategies: strategies, +// withdrawalAmounts: withdrawalAmounts +// }); + +// // queueWithdrawals +// // NOTE: Originally, you could queue a withdrawal to a different address, which would fail with a specific error +// // if third party transfers were forbidden. Now, withdrawing to a different address is forbidden regardless +// // of third party transfer status. +// cheats.expectRevert( +// "DelegationManager.queueWithdrawal: withdrawer must be staker" +// ); +// cheats.prank(staker); +// delegationManager.queueWithdrawals(queuedWithdrawalParams); +// } +// } + +// contract DelegationManagerUnitTests_completeQueuedWithdrawal is DelegationManagerUnitTests { +// function test_Revert_WhenExitWithdrawalQueuePaused() public { +// cheats.prank(pauser); +// delegationManager.pause(2 ** PAUSED_EXIT_WITHDRAWAL_QUEUE); +// _registerOperatorWithBaseDetails(defaultOperator); +// ( +// IDelegationManager.Withdrawal memory withdrawal, +// IERC20[] memory tokens, +// /* bytes32 withdrawalRoot */ +// ) = _setUpCompleteQueuedWithdrawalSingleStrat({ +// staker: defaultStaker, +// withdrawer: defaultStaker, +// depositAmount: 100, +// withdrawalAmount: 100 +// }); +// _delegateToOperatorWhoAcceptsAllStakers(defaultStaker, defaultOperator); + +// cheats.expectRevert("Pausable: index is paused"); +// delegationManager.completeQueuedWithdrawal(withdrawal, tokens, 0 /* middlewareTimesIndex */, false); +// } + +// function test_Revert_WhenInvalidWithdrawalRoot() public { +// _registerOperatorWithBaseDetails(defaultOperator); +// ( +// IDelegationManager.Withdrawal memory withdrawal, +// IERC20[] memory tokens, +// bytes32 withdrawalRoot +// ) = _setUpCompleteQueuedWithdrawalSingleStrat({ +// staker: defaultStaker, +// withdrawer: defaultStaker, +// depositAmount: 100, +// withdrawalAmount: 100 +// }); +// _delegateToOperatorWhoAcceptsAllStakers(defaultStaker, defaultOperator); + +// assertTrue(delegationManager.pendingWithdrawals(withdrawalRoot), "withdrawalRoot should be pending"); +// cheats.roll(block.number + delegationManager.getWithdrawalDelay(withdrawal.strategies)); +// cheats.prank(defaultStaker); +// delegationManager.completeQueuedWithdrawal(withdrawal, tokens, 0 /* middlewareTimesIndex */, false); +// assertFalse(delegationManager.pendingWithdrawals(withdrawalRoot), "withdrawalRoot should be completed and marked false now"); + +// cheats.roll(block.number + delegationManager.getWithdrawalDelay(withdrawal.strategies)); +// cheats.expectRevert("DelegationManager._completeQueuedWithdrawal: action is not in queue"); +// cheats.prank(defaultStaker); +// delegationManager.completeQueuedWithdrawal(withdrawal, tokens, 0 /* middlewareTimesIndex */, false); +// } + +// /** +// * @notice should revert if minWithdrawalDelayBlocks has not passed, and if +// * delegationManager.getWithdrawalDelay returns a value greater than minWithdrawalDelayBlocks +// * then it should revert if the validBlockNumber has not passed either. +// */ +// function test_Revert_WhenWithdrawalDelayBlocksNotPassed( +// uint256[] memory depositAmounts, +// bool receiveAsTokens +// ) public { +// cheats.assume(depositAmounts.length > 0 && depositAmounts.length <= 32); +// uint256[] memory withdrawalAmounts = _fuzzWithdrawalAmounts(depositAmounts); - _registerOperatorWithBaseDetails(defaultOperator); - ( - IDelegationManager.Withdrawal memory withdrawal, - IERC20[] memory tokens, - /* bytes32 withdrawalRoot */ - ) = _setUpCompleteQueuedWithdrawal({ - staker: defaultStaker, - withdrawer: defaultStaker, - depositAmounts: depositAmounts, - withdrawalAmounts: withdrawalAmounts - }); - - // prank as withdrawer address - cheats.startPrank(defaultStaker); - - cheats.expectRevert( - "DelegationManager._completeQueuedWithdrawal: minWithdrawalDelayBlocks period has not yet passed" - ); - cheats.roll(block.number + minWithdrawalDelayBlocks - 1); - delegationManager.completeQueuedWithdrawal(withdrawal, tokens, 0 /* middlewareTimesIndex */, receiveAsTokens); - - uint256 validBlockNumber = delegationManager.getWithdrawalDelay(withdrawal.strategies); - if (validBlockNumber > minWithdrawalDelayBlocks) { - cheats.expectRevert( - "DelegationManager._completeQueuedWithdrawal: withdrawalDelayBlocks period has not yet passed for this strategy" - ); - cheats.roll(validBlockNumber - 1); - delegationManager.completeQueuedWithdrawal(withdrawal, tokens, 0 /* middlewareTimesIndex */, receiveAsTokens); - } - - cheats.stopPrank(); - } - - /** - * @notice should revert when the withdrawalDelayBlocks period has not yet passed for the - * beacon chain strategy - */ - function test_Revert_WhenWithdrawalDelayBlocksNotPassed_BeaconStrat( - uint256 depositAmount, - uint256 withdrawalAmount, - uint256 beaconWithdrawalDelay - ) public { - cheats.assume(depositAmount > 1 && withdrawalAmount <= depositAmount); - beaconWithdrawalDelay = bound(beaconWithdrawalDelay, minWithdrawalDelayBlocks, MAX_WITHDRAWAL_DELAY_BLOCKS); - _registerOperatorWithBaseDetails(defaultOperator); - ( - IDelegationManager.Withdrawal memory withdrawal, - IERC20[] memory tokens, - // bytes32 withdrawalRoot - ) = _setUpCompleteQueuedWithdrawalBeaconStrat({ - staker: defaultStaker, - withdrawer: defaultStaker, - depositAmount: depositAmount, - withdrawalAmount: withdrawalAmount - }); - - IStrategy[] memory strategies = new IStrategy[](1); - strategies[0] = beaconChainETHStrategy; - uint256[] memory withdrawalDelayBlocks = new uint256[](1); - delegationManager.setStrategyWithdrawalDelayBlocks(withdrawal.strategies, withdrawalDelayBlocks); - - // prank as withdrawer address - cheats.startPrank(defaultStaker); - - cheats.expectRevert( - "DelegationManager._completeQueuedWithdrawal: minWithdrawalDelayBlocks period has not yet passed" - ); - cheats.roll(block.number + minWithdrawalDelayBlocks - 1); - delegationManager.completeQueuedWithdrawal(withdrawal, tokens, 0 /* middlewareTimesIndex */, false); - - uint256 validBlockNumber = delegationManager.getWithdrawalDelay(withdrawal.strategies); - if (validBlockNumber > minWithdrawalDelayBlocks) { - cheats.expectRevert( - "DelegationManager._completeQueuedWithdrawal: withdrawalDelayBlocks period has not yet passed for this strategy" - ); - cheats.roll(validBlockNumber - 1); - delegationManager.completeQueuedWithdrawal(withdrawal, tokens, 0 /* middlewareTimesIndex */, false); - } - - cheats.stopPrank(); - } - - function test_Revert_WhenNotCalledByWithdrawer() public { - _registerOperatorWithBaseDetails(defaultOperator); - ( - IDelegationManager.Withdrawal memory withdrawal, - IERC20[] memory tokens, - /*bytes32 withdrawalRoot*/ - ) = _setUpCompleteQueuedWithdrawalSingleStrat({ - staker: defaultStaker, - withdrawer: defaultStaker, - depositAmount: 100, - withdrawalAmount: 100 - }); - _delegateToOperatorWhoAcceptsAllStakers(defaultStaker, defaultOperator); - - cheats.roll(block.number + delegationManager.getWithdrawalDelay(withdrawal.strategies)); - cheats.expectRevert("DelegationManager._completeQueuedWithdrawal: only withdrawer can complete action"); - delegationManager.completeQueuedWithdrawal(withdrawal, tokens, 0 /* middlewareTimesIndex */, false); - } - - function test_Revert_WhenTokensArrayLengthMismatch() public { - _registerOperatorWithBaseDetails(defaultOperator); - (IDelegationManager.Withdrawal memory withdrawal, , ) = _setUpCompleteQueuedWithdrawalSingleStrat({ - staker: defaultStaker, - withdrawer: defaultStaker, - depositAmount: 100, - withdrawalAmount: 100 - }); - _delegateToOperatorWhoAcceptsAllStakers(defaultStaker, defaultOperator); - - IERC20[] memory tokens = new IERC20[](0); - cheats.roll(block.number + delegationManager.getWithdrawalDelay(withdrawal.strategies)); - cheats.expectRevert("DelegationManager._completeQueuedWithdrawal: input length mismatch"); - cheats.prank(defaultStaker); - delegationManager.completeQueuedWithdrawal(withdrawal, tokens, 0 /* middlewareTimesIndex */, true); - } - - /** - * @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 unchanged after `completeQueuedWithdrawal` - * - Checks that event `WithdrawalCompleted` is emitted with withdrawalRoot - */ - function test_completeQueuedWithdrawal_SingleStratWithdrawAsTokens( - address staker, - uint256 depositAmount, - uint256 withdrawalAmount - ) public filterFuzzedAddressInputs(staker) { - cheats.assume(staker != defaultOperator); - cheats.assume(withdrawalAmount > 0 && withdrawalAmount <= depositAmount); - _registerOperatorWithBaseDetails(defaultOperator); - ( - IDelegationManager.Withdrawal memory withdrawal, - IERC20[] memory tokens, - bytes32 withdrawalRoot - ) = _setUpCompleteQueuedWithdrawalSingleStrat({ - staker: staker, - withdrawer: staker, - depositAmount: depositAmount, - withdrawalAmount: withdrawalAmount - }); - _delegateToOperatorWhoAcceptsAllStakers(staker, defaultOperator); - uint256 operatorSharesBefore = delegationManager.operatorShares(defaultOperator, withdrawal.strategies[0]); - assertTrue(delegationManager.pendingWithdrawals(withdrawalRoot), "withdrawalRoot should be pending"); - - // completeQueuedWithdrawal - cheats.roll(block.number + delegationManager.getWithdrawalDelay(withdrawal.strategies)); - cheats.prank(staker); - cheats.expectEmit(true, true, true, true, address(delegationManager)); - emit WithdrawalCompleted(withdrawalRoot); - delegationManager.completeQueuedWithdrawal(withdrawal, tokens, 0 /* middlewareTimesIndex */, true); - - uint256 operatorSharesAfter = delegationManager.operatorShares(defaultOperator, withdrawal.strategies[0]); - assertEq(operatorSharesAfter, operatorSharesBefore, "operator shares should be unchanged"); - assertFalse(delegationManager.pendingWithdrawals(withdrawalRoot), "withdrawalRoot should be completed and marked false now"); - } - - /** - * @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 test_completeQueuedWithdrawal_SingleStratWithdrawAsShares( - address staker, - uint256 depositAmount, - uint256 withdrawalAmount - ) public filterFuzzedAddressInputs(staker) { - cheats.assume(staker != defaultOperator); - cheats.assume(withdrawalAmount > 0 && withdrawalAmount <= depositAmount); - _registerOperatorWithBaseDetails(defaultOperator); - - ( - IDelegationManager.Withdrawal memory withdrawal, - IERC20[] memory tokens, - bytes32 withdrawalRoot - ) = _setUpCompleteQueuedWithdrawalSingleStrat({ - staker: staker, - withdrawer: staker, - depositAmount: depositAmount, - withdrawalAmount: withdrawalAmount - }); - _delegateToOperatorWhoAcceptsAllStakers(staker, defaultOperator); - uint256 operatorSharesBefore = delegationManager.operatorShares(defaultOperator, withdrawal.strategies[0]); - assertTrue(delegationManager.pendingWithdrawals(withdrawalRoot), "withdrawalRoot should be pending"); - - // completeQueuedWithdrawal - cheats.roll(block.number + delegationManager.getWithdrawalDelay(withdrawal.strategies)); - cheats.prank(staker); - cheats.expectEmit(true, true, true, true, address(delegationManager)); - emit WithdrawalCompleted(withdrawalRoot); - delegationManager.completeQueuedWithdrawal(withdrawal, tokens, 0 /* middlewareTimesIndex */, false); - - uint256 operatorSharesAfter = delegationManager.operatorShares(defaultOperator, withdrawal.strategies[0]); - // Since staker is delegated, operatorShares get incremented - assertEq(operatorSharesAfter, operatorSharesBefore + withdrawalAmount, "operator shares not increased correctly"); - assertFalse(delegationManager.pendingWithdrawals(withdrawalRoot), "withdrawalRoot should be completed and marked false now"); - } -} +// _registerOperatorWithBaseDetails(defaultOperator); +// ( +// IDelegationManager.Withdrawal memory withdrawal, +// IERC20[] memory tokens, +// /* bytes32 withdrawalRoot */ +// ) = _setUpCompleteQueuedWithdrawal({ +// staker: defaultStaker, +// withdrawer: defaultStaker, +// depositAmounts: depositAmounts, +// withdrawalAmounts: withdrawalAmounts +// }); + +// // prank as withdrawer address +// cheats.startPrank(defaultStaker); + +// cheats.expectRevert( +// "DelegationManager._completeQueuedWithdrawal: minWithdrawalDelayBlocks period has not yet passed" +// ); +// cheats.roll(block.number + minWithdrawalDelayBlocks - 1); +// delegationManager.completeQueuedWithdrawal(withdrawal, tokens, 0 /* middlewareTimesIndex */, receiveAsTokens); + +// uint256 validBlockNumber = delegationManager.getWithdrawalDelay(withdrawal.strategies); +// if (validBlockNumber > minWithdrawalDelayBlocks) { +// cheats.expectRevert( +// "DelegationManager._completeQueuedWithdrawal: withdrawalDelayBlocks period has not yet passed for this strategy" +// ); +// cheats.roll(validBlockNumber - 1); +// delegationManager.completeQueuedWithdrawal(withdrawal, tokens, 0 /* middlewareTimesIndex */, receiveAsTokens); +// } + +// cheats.stopPrank(); +// } + +// /** +// * @notice should revert when the withdrawalDelayBlocks period has not yet passed for the +// * beacon chain strategy +// */ +// function test_Revert_WhenWithdrawalDelayBlocksNotPassed_BeaconStrat( +// uint256 depositAmount, +// uint256 withdrawalAmount, +// uint256 beaconWithdrawalDelay +// ) public { +// cheats.assume(depositAmount > 1 && withdrawalAmount <= depositAmount); +// beaconWithdrawalDelay = bound(beaconWithdrawalDelay, minWithdrawalDelayBlocks, MAX_WITHDRAWAL_DELAY_BLOCKS); +// _registerOperatorWithBaseDetails(defaultOperator); +// ( +// IDelegationManager.Withdrawal memory withdrawal, +// IERC20[] memory tokens, +// // bytes32 withdrawalRoot +// ) = _setUpCompleteQueuedWithdrawalBeaconStrat({ +// staker: defaultStaker, +// withdrawer: defaultStaker, +// depositAmount: depositAmount, +// withdrawalAmount: withdrawalAmount +// }); + +// IStrategy[] memory strategies = new IStrategy[](1); +// strategies[0] = beaconChainETHStrategy; +// uint256[] memory withdrawalDelayBlocks = new uint256[](1); +// delegationManager.setStrategyWithdrawalDelayBlocks(withdrawal.strategies, withdrawalDelayBlocks); + +// // prank as withdrawer address +// cheats.startPrank(defaultStaker); + +// cheats.expectRevert( +// "DelegationManager._completeQueuedWithdrawal: minWithdrawalDelayBlocks period has not yet passed" +// ); +// cheats.roll(block.number + minWithdrawalDelayBlocks - 1); +// delegationManager.completeQueuedWithdrawal(withdrawal, tokens, 0 /* middlewareTimesIndex */, false); + +// uint256 validBlockNumber = delegationManager.getWithdrawalDelay(withdrawal.strategies); +// if (validBlockNumber > minWithdrawalDelayBlocks) { +// cheats.expectRevert( +// "DelegationManager._completeQueuedWithdrawal: withdrawalDelayBlocks period has not yet passed for this strategy" +// ); +// cheats.roll(validBlockNumber - 1); +// delegationManager.completeQueuedWithdrawal(withdrawal, tokens, 0 /* middlewareTimesIndex */, false); +// } + +// cheats.stopPrank(); +// } + +// function test_Revert_WhenNotCalledByWithdrawer() public { +// _registerOperatorWithBaseDetails(defaultOperator); +// ( +// IDelegationManager.Withdrawal memory withdrawal, +// IERC20[] memory tokens, +// /*bytes32 withdrawalRoot*/ +// ) = _setUpCompleteQueuedWithdrawalSingleStrat({ +// staker: defaultStaker, +// withdrawer: defaultStaker, +// depositAmount: 100, +// withdrawalAmount: 100 +// }); +// _delegateToOperatorWhoAcceptsAllStakers(defaultStaker, defaultOperator); + +// cheats.roll(block.number + delegationManager.getWithdrawalDelay(withdrawal.strategies)); +// cheats.expectRevert("DelegationManager._completeQueuedWithdrawal: only withdrawer can complete action"); +// delegationManager.completeQueuedWithdrawal(withdrawal, tokens, 0 /* middlewareTimesIndex */, false); +// } + +// function test_Revert_WhenTokensArrayLengthMismatch() public { +// _registerOperatorWithBaseDetails(defaultOperator); +// (IDelegationManager.Withdrawal memory withdrawal, , ) = _setUpCompleteQueuedWithdrawalSingleStrat({ +// staker: defaultStaker, +// withdrawer: defaultStaker, +// depositAmount: 100, +// withdrawalAmount: 100 +// }); +// _delegateToOperatorWhoAcceptsAllStakers(defaultStaker, defaultOperator); + +// IERC20[] memory tokens = new IERC20[](0); +// cheats.roll(block.number + delegationManager.getWithdrawalDelay(withdrawal.strategies)); +// cheats.expectRevert("DelegationManager._completeQueuedWithdrawal: input length mismatch"); +// cheats.prank(defaultStaker); +// delegationManager.completeQueuedWithdrawal(withdrawal, tokens, 0 /* middlewareTimesIndex */, true); +// } + +// /** +// * @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 unchanged after `completeQueuedWithdrawal` +// * - Checks that event `WithdrawalCompleted` is emitted with withdrawalRoot +// */ +// function test_completeQueuedWithdrawal_SingleStratWithdrawAsTokens( +// address staker, +// uint256 depositAmount, +// uint256 withdrawalAmount +// ) public filterFuzzedAddressInputs(staker) { +// cheats.assume(staker != defaultOperator); +// cheats.assume(withdrawalAmount > 0 && withdrawalAmount <= depositAmount); +// _registerOperatorWithBaseDetails(defaultOperator); +// ( +// IDelegationManager.Withdrawal memory withdrawal, +// IERC20[] memory tokens, +// bytes32 withdrawalRoot +// ) = _setUpCompleteQueuedWithdrawalSingleStrat({ +// staker: staker, +// withdrawer: staker, +// depositAmount: depositAmount, +// withdrawalAmount: withdrawalAmount +// }); +// _delegateToOperatorWhoAcceptsAllStakers(staker, defaultOperator); +// uint256 operatorSharesBefore = delegationManager.operatorShares(defaultOperator, withdrawal.strategies[0]); +// assertTrue(delegationManager.pendingWithdrawals(withdrawalRoot), "withdrawalRoot should be pending"); + +// // completeQueuedWithdrawal +// cheats.roll(block.number + delegationManager.getWithdrawalDelay(withdrawal.strategies)); +// cheats.prank(staker); +// cheats.expectEmit(true, true, true, true, address(delegationManager)); +// emit WithdrawalCompleted(withdrawalRoot); +// delegationManager.completeQueuedWithdrawal(withdrawal, tokens, 0 /* middlewareTimesIndex */, true); + +// uint256 operatorSharesAfter = delegationManager.operatorShares(defaultOperator, withdrawal.strategies[0]); +// assertEq(operatorSharesAfter, operatorSharesBefore, "operator shares should be unchanged"); +// assertFalse(delegationManager.pendingWithdrawals(withdrawalRoot), "withdrawalRoot should be completed and marked false now"); +// } + +// /** +// * @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 test_completeQueuedWithdrawal_SingleStratWithdrawAsShares( +// address staker, +// uint256 depositAmount, +// uint256 withdrawalAmount +// ) public filterFuzzedAddressInputs(staker) { +// cheats.assume(staker != defaultOperator); +// cheats.assume(withdrawalAmount > 0 && withdrawalAmount <= depositAmount); +// _registerOperatorWithBaseDetails(defaultOperator); + +// ( +// IDelegationManager.Withdrawal memory withdrawal, +// IERC20[] memory tokens, +// bytes32 withdrawalRoot +// ) = _setUpCompleteQueuedWithdrawalSingleStrat({ +// staker: staker, +// withdrawer: staker, +// depositAmount: depositAmount, +// withdrawalAmount: withdrawalAmount +// }); +// _delegateToOperatorWhoAcceptsAllStakers(staker, defaultOperator); +// uint256 operatorSharesBefore = delegationManager.operatorShares(defaultOperator, withdrawal.strategies[0]); +// assertTrue(delegationManager.pendingWithdrawals(withdrawalRoot), "withdrawalRoot should be pending"); + +// // completeQueuedWithdrawal +// cheats.roll(block.number + delegationManager.getWithdrawalDelay(withdrawal.strategies)); +// cheats.prank(staker); +// cheats.expectEmit(true, true, true, true, address(delegationManager)); +// emit WithdrawalCompleted(withdrawalRoot); +// delegationManager.completeQueuedWithdrawal(withdrawal, tokens, 0 /* middlewareTimesIndex */, false); + +// uint256 operatorSharesAfter = delegationManager.operatorShares(defaultOperator, withdrawal.strategies[0]); +// // Since staker is delegated, operatorShares get incremented +// assertEq(operatorSharesAfter, operatorSharesBefore + withdrawalAmount, "operator shares not increased correctly"); +// assertFalse(delegationManager.pendingWithdrawals(withdrawalRoot), "withdrawalRoot should be completed and marked false now"); +// } +// } diff --git a/src/test/unit/EigenPodManagerUnit.t.sol b/src/test/unit/EigenPodManagerUnit.t.sol index b31d1d404..b1105e821 100644 --- a/src/test/unit/EigenPodManagerUnit.t.sol +++ b/src/test/unit/EigenPodManagerUnit.t.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.12; +pragma solidity ^0.8.27; import "@openzeppelin/contracts/proxy/beacon/UpgradeableBeacon.sol"; @@ -197,7 +197,7 @@ contract EigenPodManagerUnitTests_ShareUpdateTests is EigenPodManagerUnitTests { eigenPodManager.addShares(defaultStaker, 0); } - function test_addShares_revert_podOwnerZeroAddress() public { + function test_addShares_revert_podOwnerInputAddressZero() public { cheats.prank(address(delegationManagerMock)); cheats.expectRevert("EigenPodManager.addShares: podOwner cannot be zero address"); eigenPodManager.addShares(address(0), 0); @@ -312,13 +312,13 @@ contract EigenPodManagerUnitTests_ShareUpdateTests is EigenPodManagerUnitTests { WithdrawSharesAsTokens Tests ******************************************************************************/ - function test_withdrawSharesAsTokens_revert_podOwnerZeroAddress() public { + function test_withdrawSharesAsTokens_revert_podOwnerInputAddressZero() public { cheats.prank(address(delegationManagerMock)); cheats.expectRevert("EigenPodManager.withdrawSharesAsTokens: podOwner cannot be zero address"); eigenPodManager.withdrawSharesAsTokens(address(0), address(0), 0); } - function test_withdrawSharesAsTokens_revert_destinationZeroAddress() public { + function test_withdrawSharesAsTokens_revert_destinationInputAddressZero() public { cheats.prank(address(delegationManagerMock)); cheats.expectRevert("EigenPodManager.withdrawSharesAsTokens: destination cannot be zero address"); eigenPodManager.withdrawSharesAsTokens(defaultStaker, address(0), 0); @@ -403,7 +403,7 @@ contract EigenPodManagerUnitTests_BeaconChainETHBalanceUpdateTests is EigenPodMa eigenPodManager.recordBeaconChainETHBalanceUpdate(defaultStaker, 0); } - function test_recordBalanceUpdate_revert_zeroAddress() public { + function test_recordBalanceUpdate_revert_InputAddressZero() public { IEigenPod zeroAddressPod = _deployAndReturnEigenPodForStaker(address(0)); cheats.prank(address(zeroAddressPod)); cheats.expectRevert("EigenPodManager.recordBeaconChainETHBalanceUpdate: podOwner cannot be zero address"); @@ -417,9 +417,9 @@ contract EigenPodManagerUnitTests_BeaconChainETHBalanceUpdateTests is EigenPodMa eigenPodManager.recordBeaconChainETHBalanceUpdate(defaultStaker, sharesDelta); } - function testFuzz_recordBalanceUpdateX(int224 sharesBefore, int224 sharesDelta) public { + function testFuzz_recordBalanceUpdateX(int224 scaledSharesBefore, int224 sharesDelta) public { // Constrain inputs - int256 scaledSharesBefore = sharesBefore * int256(GWEI_TO_WEI); + int256 scaledSharesBefore = scaledSharesBefore * int256(GWEI_TO_WEI); int256 scaledSharesDelta = sharesDelta * int256(GWEI_TO_WEI); // Initialize shares @@ -456,35 +456,35 @@ contract EigenPodManagerUnitTests_ShareAdjustmentCalculationTests is EigenPodMan eigenLayerProxyAdmin.upgrade(TransparentUpgradeableProxy(payable(address(eigenPodManager))), address(eigenPodManagerWrapper)); } - function testFuzz_shareAdjustment_negativeToNegative(int256 sharesBefore, int256 sharesAfter) public { - cheats.assume(sharesBefore <= 0); - cheats.assume(sharesAfter <= 0); + function testFuzz_shareAdjustment_negativeToNegative(int256 scaledSharesBefore, int256 scaledSharesAfter) public { + cheats.assume(scaledSharesBefore <= 0); + cheats.assume(scaledSharesAfter <= 0); - int256 sharesDelta = eigenPodManagerWrapper.calculateChangeInDelegatableShares(sharesBefore, sharesAfter); + int256 sharesDelta = eigenPodManagerWrapper.calculateChangeInDelegatableShares(scaledSharesBefore, scaledSharesAfter); assertEq(sharesDelta, 0, "Shares delta must be 0"); } - function testFuzz_shareAdjustment_negativeToPositive(int256 sharesBefore, int256 sharesAfter) public { - cheats.assume(sharesBefore <= 0); - cheats.assume(sharesAfter > 0); + function testFuzz_shareAdjustment_negativeToPositive(int256 scaledSharesBefore, int256 scaledSharesAfter) public { + cheats.assume(scaledSharesBefore <= 0); + cheats.assume(scaledSharesAfter > 0); - int256 sharesDelta = eigenPodManagerWrapper.calculateChangeInDelegatableShares(sharesBefore, sharesAfter); - assertEq(sharesDelta, sharesAfter, "Shares delta must be equal to sharesAfter"); + int256 sharesDelta = eigenPodManagerWrapper.calculateChangeInDelegatableShares(scaledSharesBefore, scaledSharesAfter); + assertEq(sharesDelta, scaledSharesAfter, "Shares delta must be equal to scaledSharesAfter"); } - function testFuzz_shareAdjustment_positiveToNegative(int256 sharesBefore, int256 sharesAfter) public { - cheats.assume(sharesBefore > 0); - cheats.assume(sharesAfter <= 0); + function testFuzz_shareAdjustment_positiveToNegative(int256 scaledSharesBefore, int256 scaledSharesAfter) public { + cheats.assume(scaledSharesBefore > 0); + cheats.assume(scaledSharesAfter <= 0); - int256 sharesDelta = eigenPodManagerWrapper.calculateChangeInDelegatableShares(sharesBefore, sharesAfter); - assertEq(sharesDelta, -sharesBefore, "Shares delta must be equal to the negative of sharesBefore"); + int256 sharesDelta = eigenPodManagerWrapper.calculateChangeInDelegatableShares(scaledSharesBefore, scaledSharesAfter); + assertEq(sharesDelta, -scaledSharesBefore, "Shares delta must be equal to the negative of scaledSharesBefore"); } - function testFuzz_shareAdjustment_positiveToPositive(int256 sharesBefore, int256 sharesAfter) public { - cheats.assume(sharesBefore > 0); - cheats.assume(sharesAfter > 0); + function testFuzz_shareAdjustment_positiveToPositive(int256 scaledSharesBefore, int256 scaledSharesAfter) public { + cheats.assume(scaledSharesBefore > 0); + cheats.assume(scaledSharesAfter > 0); - int256 sharesDelta = eigenPodManagerWrapper.calculateChangeInDelegatableShares(sharesBefore, sharesAfter); - assertEq(sharesDelta, sharesAfter - sharesBefore, "Shares delta must be equal to the difference between sharesAfter and sharesBefore"); + int256 sharesDelta = eigenPodManagerWrapper.calculateChangeInDelegatableShares(scaledSharesBefore, scaledSharesAfter); + assertEq(sharesDelta, scaledSharesAfter - scaledSharesBefore, "Shares delta must be equal to the difference between scaledSharesAfter and scaledSharesBefore"); } } diff --git a/src/test/unit/EigenPodUnit.t.sol b/src/test/unit/EigenPodUnit.t.sol index 6314a107c..8b49ad429 100644 --- a/src/test/unit/EigenPodUnit.t.sol +++ b/src/test/unit/EigenPodUnit.t.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.12; +pragma solidity ^0.8.27; import "@openzeppelin/contracts/proxy/beacon/UpgradeableBeacon.sol"; import "@openzeppelin/contracts/utils/Create2.sol"; diff --git a/src/test/unit/PausableUnit.t.sol b/src/test/unit/PausableUnit.t.sol index c8f03aa92..f848d98a4 100644 --- a/src/test/unit/PausableUnit.t.sol +++ b/src/test/unit/PausableUnit.t.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.12; +pragma solidity ^0.8.27; import "forge-std/Test.sol"; diff --git a/src/test/unit/PauserRegistryUnit.t.sol b/src/test/unit/PauserRegistryUnit.t.sol index 802c228e8..22e54c449 100644 --- a/src/test/unit/PauserRegistryUnit.t.sol +++ b/src/test/unit/PauserRegistryUnit.t.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.12; +pragma solidity ^0.8.27; import "forge-std/Test.sol"; diff --git a/src/test/unit/RewardsCoordinatorUnit.t.sol b/src/test/unit/RewardsCoordinatorUnit.t.sol index 0e3d32df2..198458ee2 100644 --- a/src/test/unit/RewardsCoordinatorUnit.t.sol +++ b/src/test/unit/RewardsCoordinatorUnit.t.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.12; +pragma solidity ^0.8.27; import "@openzeppelin/contracts/mocks/ERC1271WalletMock.sol"; import "@openzeppelin/contracts/token/ERC20/presets/ERC20PresetFixedSupply.sol"; @@ -55,8 +55,18 @@ contract RewardsCoordinatorUnitTests is EigenLayerUnitTestSetup, IRewardsCoordin /// @notice absolute min timestamp that a rewards can start at uint32 GENESIS_REWARDS_TIMESTAMP = 1712188800; + /// @notice Lower bound start range is ~1 month into the past, multiple of CALCULATION_INTERVAL_SECONDS + uint32 OPERATOR_SET_MAX_RETROACTIVE_LENGTH = 28 days; + /// @notice absolute min timestamp (seconds) that an operatorSet rewards submission can start at + uint32 OPERATOR_SET_GENESIS_REWARDS_TIMESTAMP = 1720656000; + + /// @notice Delay in timestamp before a posted root can be claimed against uint32 activationDelay = 7 days; + /// @notice The activation delay until an updated operator's commission bips takes effect + uint32 OPERATOR_COMMISSION_ACTIVATION_DELAY = 17.5 days; + /// @notice The maximum commission bips that can be set for an operator + uint16 MAX_COMMISSION_BIPS = 10000; /// @notice the commission for all operators across all avss uint16 globalCommissionBips = 1000; @@ -74,7 +84,10 @@ contract RewardsCoordinatorUnitTests is EigenLayerUnitTestSetup, IRewardsCoordin uint8 internal constant PAUSED_PROCESS_CLAIM = 2; /// @dev Index for flag that pauses submitRoots - uint8 internal constant PAUSED_SUBMIT_ROOTS = 3; + uint8 internal constant PAUSED_SUBMIT_DISABLE_ROOTS = 3; + + /// @dev Index for flag that pauses calling rewardOperatorSetForRange + uint8 internal constant PAUSED_REWARD_OPERATOR_SET = 4; /// @dev Index for flag that pauses rewardAllStakersAndOperators uint8 internal constant PAUSED_REWARD_ALL_STAKERS_AND_OPERATORS = 4; @@ -93,11 +106,14 @@ contract RewardsCoordinatorUnitTests is EigenLayerUnitTestSetup, IRewardsCoordin rewardsCoordinatorImplementation = new RewardsCoordinator( delegationManagerMock, strategyManagerMock, + avsDirectoryMock, CALCULATION_INTERVAL_SECONDS, MAX_REWARDS_DURATION, MAX_RETROACTIVE_LENGTH, MAX_FUTURE_LENGTH, - GENESIS_REWARDS_TIMESTAMP + GENESIS_REWARDS_TIMESTAMP, + OPERATOR_SET_GENESIS_REWARDS_TIMESTAMP, + OPERATOR_SET_MAX_RETROACTIVE_LENGTH ); rewardsCoordinator = RewardsCoordinator( address( @@ -1339,7 +1355,7 @@ contract RewardsCoordinatorUnitTests_submitRoot is RewardsCoordinatorUnitTests { function test_Revert_WhenSubmitRootPaused() public { cheats.prank(pauser); - rewardsCoordinator.pause(2 ** PAUSED_SUBMIT_ROOTS); + rewardsCoordinator.pause(2 ** PAUSED_SUBMIT_DISABLE_ROOTS); cheats.expectRevert("Pausable: index is paused"); rewardsCoordinator.submitRoot(bytes32(0), 0); @@ -2254,3 +2270,706 @@ contract RewardsCoordinatorUnitTests_processClaim is RewardsCoordinatorUnitTests return claims; } } + +contract RewardsCoordinatorUnitTests_disableRoot is RewardsCoordinatorUnitTests { + function testFuzz_disableRoot_Revert_WhenNotRewardsUpdater( + address invalidRewardsUpdater + ) public filterFuzzedAddressInputs(invalidRewardsUpdater) { + cheats.prank(invalidRewardsUpdater); + + cheats.expectRevert("RewardsCoordinator: caller is not the rewardsUpdater"); + rewardsCoordinator.disableRoot(0); + } + + function test_disableRoot_Revert_WhenPaused() public { + cheats.prank(pauser); + rewardsCoordinator.pause(2 ** PAUSED_SUBMIT_DISABLE_ROOTS); + + cheats.expectRevert("Pausable: index is paused"); + rewardsCoordinator.disableRoot(0); + } + + function testFuzz_disableRoot_Revert_WhenRootIndexOutOfBounds(uint32 rootIndex) public { + // submitRoots with indexes 0,1,2 + _submitRoots(); + cheats.assume(rootIndex > 2); + + cheats.expectRevert("RewardsCoordinator.disableRoot: invalid rootIndex"); + cheats.prank(rewardsUpdater); + rewardsCoordinator.disableRoot(rootIndex); + } + + function testFuzz_disableRoot_Revert_WhenRootAlreadyDisabled(uint32 rootIndex) public { + // submitRoots with indexes 0,1,2 + _submitRoots(); + rootIndex = uint32(bound(uint256(rootIndex), 0, 2)); + + cheats.startPrank(rewardsUpdater); + rewardsCoordinator.disableRoot(rootIndex); + + cheats.expectRevert("RewardsCoordinator.disableRoot: root already disabled"); + rewardsCoordinator.disableRoot(rootIndex); + cheats.stopPrank(); + } + + function testeFuzz_disableRoot_Revert_WhenRootAlreadyActivated(uint32 rootIndex) public { + // submitRoots with indexes 0,1,2 + _submitRoots(); + rootIndex = uint32(bound(uint256(rootIndex), 0, 2)); + cheats.warp(block.timestamp + activationDelay); + + cheats.expectRevert("RewardsCoordinator.disableRoot: root already activated"); + cheats.prank(rewardsUpdater); + rewardsCoordinator.disableRoot(rootIndex); + } + + function testFuzz_disableRoot(uint32 rootIndex, uint256 randSalt) public { + // Set timestamp to some value in the future + cheats.warp(bound(randSalt, 1e5, 1e6)); + uint256 currTimestamp = block.timestamp; + // submitRoots with indexes 0,1,2 + _submitRoots(); + rootIndex = uint32(bound(uint256(rootIndex), 0, 2)); + + cheats.warp(currTimestamp); + + cheats.expectEmit(true, true, true, true, address(rewardsCoordinator)); + emit DistributionRootDisabled(rootIndex); + cheats.prank(rewardsUpdater); + rewardsCoordinator.disableRoot(rootIndex); + + assertEq( + rewardsCoordinator.getDistributionRootAtIndex(rootIndex).disabled, + true, + "root should be disabled" + ); + } + + function _submitRoots() internal { + cheats.warp(1e6); + + // submitRoots with indexes 0,1,2 + cheats.startPrank(rewardsUpdater); + rewardsCoordinator.submitRoot(bytes32("0"), uint32(block.timestamp - 1)); + + cheats.warp(block.timestamp + 2); + rewardsCoordinator.submitRoot(bytes32("1"), uint32(block.timestamp - 1)); + + cheats.warp(block.timestamp + 2); + rewardsCoordinator.submitRoot(bytes32("2"), uint32(block.timestamp - 1)); + + cheats.stopPrank(); + } +} + +contract RewardsCoordinatorUnitTests_operatorCommission is RewardsCoordinatorUnitTests { + uint8 numberOfRewardTypes = 1; + + function testFuzz_operatorCommissionBips_EmptyHistory( + address operator, + OperatorSet calldata operatorSet, + uint8 rewardTypeEnum + ) public { + rewardTypeEnum = uint8(bound(rewardTypeEnum, 0, numberOfRewardTypes - 1)); + IRewardsCoordinator.RewardType rewardType = IRewardsCoordinator.RewardType(rewardTypeEnum); + rewardType = IRewardsCoordinator.RewardType(uint8(bound(uint256(rewardType), 0, 1))); + // Check operator commission + uint32 operatorCommissionBipsStored = rewardsCoordinator.getOperatorCommissionBips(operator, operatorSet, rewardType); + assertEq( + globalCommissionBips, + operatorCommissionBipsStored, + "Incorrect default operator commission bips" + ); + } + + function testFuzz_setOperatorCommissionBips_Reverts_WhenBipsGreaterThanMax( + address operator, + OperatorSet calldata operatorSet, + uint8 rewardTypeEnum, + uint16 newOperatorCommissionBips + ) public filterFuzzedAddressInputs(operator) { + rewardTypeEnum = uint8(bound(rewardTypeEnum, 0, numberOfRewardTypes - 1)); + IRewardsCoordinator.RewardType rewardType = IRewardsCoordinator.RewardType(rewardTypeEnum); + cheats.assume(newOperatorCommissionBips > MAX_COMMISSION_BIPS); + cheats.expectRevert("RewardsCoordinator.setOperatorCommissionBips: commissionBips too high"); + cheats.prank(operator); + rewardsCoordinator.setOperatorCommissionBips(operatorSet, rewardType, newOperatorCommissionBips); + } + + /// @notice test setting operator commission bips to a new value with empty history + function testFuzz_setOperatorCommissionBips_EmptyHistory( + address operator, + OperatorSet calldata operatorSet, + uint8 rewardTypeEnum, + uint16 newOperatorCommissionBips, + uint256 randSalt + ) public filterFuzzedAddressInputs(operator) { + rewardTypeEnum = uint8(bound(rewardTypeEnum, 0, numberOfRewardTypes - 1)); + IRewardsCoordinator.RewardType rewardType = IRewardsCoordinator.RewardType(rewardTypeEnum); + cheats.assume(newOperatorCommissionBips != globalCommissionBips); + cheats.assume(newOperatorCommissionBips <= MAX_COMMISSION_BIPS); + // 1. Set operator commission and check updated value hasn't taken effect yet + uint16 prevOperatorCommissionBips = rewardsCoordinator.getOperatorCommissionBips(operator, operatorSet, rewardType); + cheats.prank(operator); + uint32 effectTimestamp = rewardsCoordinator.setOperatorCommissionBips( + operatorSet, + rewardType, + newOperatorCommissionBips + ); + assertTrue( + rewardsCoordinator.getOperatorCommissionBips(operator, operatorSet, rewardType) == prevOperatorCommissionBips, + "Operator commission bips should not be updated" + ); + assertTrue( + rewardsCoordinator.getOperatorCommissionBips(operator, operatorSet, rewardType) != newOperatorCommissionBips, + "Operator commission bips should not be updated" + ); + + // 2. warp timestamp forwards to random time that is not the effectTimestamp + uint256 warpTimestamp = bound(randSalt, block.timestamp, effectTimestamp - 1); + cheats.warp(warpTimestamp); + assertTrue( + rewardsCoordinator.getOperatorCommissionBips(operator, operatorSet, rewardType) != newOperatorCommissionBips, + "Operator commission bips should still be not updated" + ); + + // 3. warp timestamp forwards to effectTimestamp, operator commission should be updated now + cheats.warp(effectTimestamp); + assertTrue( + rewardsCoordinator.getOperatorCommissionBips(operator, operatorSet, rewardType) == newOperatorCommissionBips, + "Operator commission bips should be updated" + ); + } + + /// @notice test setting operator commission bips to a new value with non empty history + function testFuzz_setOperatorCommissionBips_WithHistory( + address operator, + OperatorSet calldata operatorSet, + uint8 rewardTypeEnum, + uint16 newOperatorCommissionBips, + uint256 randSalt + ) public filterFuzzedAddressInputs(operator) { + rewardTypeEnum = uint8(bound(rewardTypeEnum, 0, numberOfRewardTypes - 1)); + IRewardsCoordinator.RewardType rewardType = IRewardsCoordinator.RewardType(rewardTypeEnum); + cheats.assume(newOperatorCommissionBips <= MAX_COMMISSION_BIPS); + + // 1. Set operator commission to initial value with existing history + uint16 prevOperatorCommissionBips = uint16(bound(randSalt, 0, MAX_COMMISSION_BIPS)); + cheats.assume(prevOperatorCommissionBips != newOperatorCommissionBips); + cheats.prank(operator); + uint32 effectTimestamp = rewardsCoordinator.setOperatorCommissionBips( + operatorSet, + rewardType, + prevOperatorCommissionBips + ); + cheats.warp(effectTimestamp); + assertTrue( + rewardsCoordinator.getOperatorCommissionBips(operator, operatorSet, rewardType) == prevOperatorCommissionBips, + "1. Operator commission bips should be initialized properly" + ); + assertEq( + rewardsCoordinator.getOperatorCommissionUpdateHistoryLength(operator, operatorSet, rewardType), + 1, + "2. Invalid commission history length" + ); + + // 2. Set operator commission and check updated value hasn't taken effect yet + cheats.prank(operator); + effectTimestamp = rewardsCoordinator.setOperatorCommissionBips( + operatorSet, + rewardType, + newOperatorCommissionBips + ); + assertEq( + rewardsCoordinator.getOperatorCommissionUpdateHistoryLength(operator, operatorSet, rewardType), + 2, + "3. Invalid commission history length" + ); + assertTrue( + rewardsCoordinator.getOperatorCommissionBips(operator, operatorSet, rewardType) == prevOperatorCommissionBips, + "4. Operator commission bips should not be updated" + ); + assertTrue( + rewardsCoordinator.getOperatorCommissionBips(operator, operatorSet, rewardType) != newOperatorCommissionBips, + "5. Operator commission bips should not be updated" + ); + + // 3. warp timestamp forwards to random time that is not the effectTimestamp + uint256 warpTimestamp = bound(randSalt, block.timestamp, effectTimestamp - 1); + + cheats.warp(warpTimestamp); + assertTrue( + rewardsCoordinator.getOperatorCommissionBips(operator, operatorSet, rewardType) == prevOperatorCommissionBips, + "6. Operator commission bips should still be not updated" + ); + + // 4. warp timestamp forwards to effectTimestamp, operator commission should be updated now + cheats.warp(effectTimestamp); + assertTrue( + rewardsCoordinator.getOperatorCommissionBips(operator, operatorSet, rewardType) == newOperatorCommissionBips, + "7.Operator commission bips should be updated" + ); + } + + /// @notice test setting operator commission bips to a new value with pending update + /// has same effectTimestamp. Should overrwrite previous value + function testFuzz_setOperatorCommissionBips_SameBlockUpdate( + address operator, + OperatorSet calldata operatorSet, + uint8 rewardTypeEnum, + uint16 pendingCommissionBips, + uint16 overwriteCommissionBips + ) public filterFuzzedAddressInputs(operator) { + rewardTypeEnum = uint8(bound(rewardTypeEnum, 0, numberOfRewardTypes - 1)); + IRewardsCoordinator.RewardType rewardType = IRewardsCoordinator.RewardType(rewardTypeEnum); + cheats.assume(pendingCommissionBips <= MAX_COMMISSION_BIPS); + cheats.assume(overwriteCommissionBips <= MAX_COMMISSION_BIPS); + cheats.prank(operator); + uint32 effectTimestamp = rewardsCoordinator.setOperatorCommissionBips( + operatorSet, + rewardType, + pendingCommissionBips + ); + assertEq( + rewardsCoordinator.getOperatorCommissionUpdateHistoryLength(operator, operatorSet, rewardType), + 1, + "1. Invalid commission history length" + ); + cheats.prank(operator); + uint32 effectTimestamp2 = rewardsCoordinator.setOperatorCommissionBips( + operatorSet, + rewardType, + overwriteCommissionBips + ); + assertEq( + rewardsCoordinator.getOperatorCommissionUpdateHistoryLength(operator, operatorSet, rewardType), + 1, + "2. Invalid commission history length" + ); + assertEq( + effectTimestamp, + effectTimestamp2, + "3. Effect timestamp should be the same" + ); + cheats.warp(effectTimestamp); + assertEq( + rewardsCoordinator.getOperatorCommissionBips(operator, operatorSet, rewardType), + overwriteCommissionBips, + "4. Operator commission bips should be updated" + ); + } +} + +contract RewardsCoordinatorUnitTests_rewardOperatorSetForRange is RewardsCoordinatorUnitTests { + uint32 defaultOperatorSetId = 0; + uint32 validDuration = 2 weeks; + uint32 validStartTimestamp = OPERATOR_SET_GENESIS_REWARDS_TIMESTAMP; + + function test_Revert_WhenPaused() public { + cheats.prank(pauser); + rewardsCoordinator.pause(2 ** PAUSED_REWARD_OPERATOR_SET); + + cheats.expectRevert("Pausable: index is paused"); + IRewardsCoordinator.OperatorSetRewardsSubmission[] memory rewardsSubmissions; + rewardsCoordinator.rewardOperatorSetForRange(rewardsSubmissions); + } + + function test_Revert_WhenReentrancy() public { + uint256 amount = 1e38-1; + Reenterer reenterer = new Reenterer(); + + reenterer.prepareReturnData(abi.encode(amount)); + + address targetToUse = address(rewardsCoordinator); + uint256 msgValueToUse = 0; + + _deployMockRewardTokens(address(this), 1); + + IRewardsCoordinator.OperatorSetRewardsSubmission[] memory rewardsSubmissions = new IRewardsCoordinator.OperatorSetRewardsSubmission[](1); + rewardsSubmissions[0] = IRewardsCoordinator.OperatorSetRewardsSubmission({ + rewardType: IRewardsCoordinator.RewardType.DELEGATED_STAKE, + operatorSetId: defaultOperatorSetId, + strategiesAndMultipliers: defaultStrategyAndMultipliers, + token: IERC20(address(reenterer)), + amount: amount, + startTimestamp: uint32(block.timestamp), + duration: 0 + }); + + bytes memory calldataToUse = abi.encodeWithSelector(RewardsCoordinator.createAVSRewardsSubmission.selector, rewardsSubmissions); + reenterer.prepare(targetToUse, msgValueToUse, calldataToUse, bytes("ReentrancyGuard: reentrant call")); + + cheats.expectRevert(); + rewardsCoordinator.rewardOperatorSetForRange(rewardsSubmissions); + } + + function test_Revert_EmptyStratsAndMultipliers() public { + IRewardsCoordinator.StrategyAndMultiplier[] memory emptyStratsAndMultipliers; + IRewardsCoordinator.OperatorSetRewardsSubmission[] memory rewardsSubmissions = new IRewardsCoordinator.OperatorSetRewardsSubmission[](1); + rewardsSubmissions[0] = IRewardsCoordinator.OperatorSetRewardsSubmission({ + rewardType: IRewardsCoordinator.RewardType.DELEGATED_STAKE, + operatorSetId: defaultOperatorSetId, + strategiesAndMultipliers: emptyStratsAndMultipliers, + token: IERC20(address(this)), + amount: 1, + startTimestamp: uint32(block.timestamp), + duration: 0 + }); + + cheats.prank(defaultAVS); + cheats.expectRevert("RewardsCoordinator._validateRewardsSubmission: no strategies set"); + rewardsCoordinator.rewardOperatorSetForRange(rewardsSubmissions); + } + + function test_Revert_ZeroAmount() public { + uint256 amount = 0; + + IRewardsCoordinator.OperatorSetRewardsSubmission[] memory rewardsSubmissions = new IRewardsCoordinator.OperatorSetRewardsSubmission[](1); + rewardsSubmissions[0] = IRewardsCoordinator.OperatorSetRewardsSubmission({ + rewardType: IRewardsCoordinator.RewardType.DELEGATED_STAKE, + operatorSetId: defaultOperatorSetId, + strategiesAndMultipliers: defaultStrategyAndMultipliers, + token: IERC20(address(this)), + amount: amount, + startTimestamp: uint32(block.timestamp), + duration: 0 + }); + + cheats.prank(defaultAVS); + cheats.expectRevert("RewardsCoordinator._validateRewardsSubmission: amount cannot be 0"); + rewardsCoordinator.rewardOperatorSetForRange(rewardsSubmissions); + } + + function test_Revert_AmountTooLarge() public { + uint256 amount = 1e38; + + IRewardsCoordinator.OperatorSetRewardsSubmission[] memory rewardsSubmissions = new IRewardsCoordinator.OperatorSetRewardsSubmission[](1); + rewardsSubmissions[0] = IRewardsCoordinator.OperatorSetRewardsSubmission({ + rewardType: IRewardsCoordinator.RewardType.DELEGATED_STAKE, + operatorSetId: defaultOperatorSetId, + strategiesAndMultipliers: defaultStrategyAndMultipliers, + token: IERC20(address(this)), + amount: amount, + startTimestamp: uint32(block.timestamp), + duration: 0 + }); + + cheats.prank(defaultAVS); + cheats.expectRevert("RewardsCoordinator._validateRewardsSubmission: amount too large"); + rewardsCoordinator.rewardOperatorSetForRange(rewardsSubmissions); + } + + function test_Revert_DurationTooLarge() public { + uint32 duration = MAX_REWARDS_DURATION + 1; + + IRewardsCoordinator.OperatorSetRewardsSubmission[] memory rewardsSubmissions = new IRewardsCoordinator.OperatorSetRewardsSubmission[](1); + rewardsSubmissions[0] = IRewardsCoordinator.OperatorSetRewardsSubmission({ + rewardType: IRewardsCoordinator.RewardType.DELEGATED_STAKE, + operatorSetId: defaultOperatorSetId, + strategiesAndMultipliers: defaultStrategyAndMultipliers, + token: IERC20(address(this)), + amount: 1, + startTimestamp: uint32(block.timestamp), + duration: duration + }); + + cheats.prank(defaultAVS); + cheats.expectRevert("RewardsCoordinator._validateRewardsSubmission: duration exceeds MAX_REWARDS_DURATION"); + rewardsCoordinator.rewardOperatorSetForRange(rewardsSubmissions); + } + + function test_Revert_DurationInvalidMultiple(uint256 duration) public { + uint256 duration = CALCULATION_INTERVAL_SECONDS - 1; + + IRewardsCoordinator.OperatorSetRewardsSubmission[] memory rewardsSubmissions = new IRewardsCoordinator.OperatorSetRewardsSubmission[](1); + rewardsSubmissions[0] = IRewardsCoordinator.OperatorSetRewardsSubmission({ + rewardType: IRewardsCoordinator.RewardType.DELEGATED_STAKE, + operatorSetId: defaultOperatorSetId, + strategiesAndMultipliers: defaultStrategyAndMultipliers, + token: IERC20(address(this)), + amount: 1, + startTimestamp: uint32(block.timestamp), + duration: uint32(duration) + }); + + cheats.prank(defaultAVS); + cheats.expectRevert("RewardsCoordinator._validateRewardsSubmission: duration must be a multiple of CALCULATION_INTERVAL_SECONDS"); + rewardsCoordinator.rewardOperatorSetForRange(rewardsSubmissions); + } + + function test_Revert_InvalidStartTimestamp() public { + uint32 startTimestamp = OPERATOR_SET_GENESIS_REWARDS_TIMESTAMP + 1; + + IRewardsCoordinator.OperatorSetRewardsSubmission[] memory rewardsSubmissions = new IRewardsCoordinator.OperatorSetRewardsSubmission[](1); + rewardsSubmissions[0] = IRewardsCoordinator.OperatorSetRewardsSubmission({ + rewardType: IRewardsCoordinator.RewardType.DELEGATED_STAKE, + operatorSetId: defaultOperatorSetId, + strategiesAndMultipliers: defaultStrategyAndMultipliers, + token: IERC20(address(this)), + amount: 1, + startTimestamp: startTimestamp, + duration: validDuration + }); + + cheats.prank(defaultAVS); + cheats.expectRevert("RewardsCoordinator._validateRewardsSubmission: startTimestamp must be a multiple of CALCULATION_INTERVAL_SECONDS"); + rewardsCoordinator.rewardOperatorSetForRange(rewardsSubmissions); + } + + function test_Revert_StartTimestampPriorToGenesis() public { + uint256 startTimestamp = OPERATOR_SET_GENESIS_REWARDS_TIMESTAMP - CALCULATION_INTERVAL_SECONDS; + + IRewardsCoordinator.OperatorSetRewardsSubmission[] memory rewardsSubmissions = new IRewardsCoordinator.OperatorSetRewardsSubmission[](1); + rewardsSubmissions[0] = IRewardsCoordinator.OperatorSetRewardsSubmission({ + rewardType: IRewardsCoordinator.RewardType.DELEGATED_STAKE, + operatorSetId: defaultOperatorSetId, + strategiesAndMultipliers: defaultStrategyAndMultipliers, + token: IERC20(address(this)), + amount: 1, + startTimestamp: uint32(startTimestamp), + duration: validDuration + }); + + cheats.prank(defaultAVS); + cheats.expectRevert("RewardsCoordinator._validateRewardsSubmission: startTimestamp too far in the past"); + rewardsCoordinator.rewardOperatorSetForRange(rewardsSubmissions); + } + + /// @notice Warps block timestamp & attemps to go make a reward to genesis + function test_Revert_StartTimestampGoesFarBack() public { + /// Warp to a timestamp past max retroactive length + cheats.warp(OPERATOR_SET_GENESIS_REWARDS_TIMESTAMP + OPERATOR_SET_MAX_RETROACTIVE_LENGTH + CALCULATION_INTERVAL_SECONDS); + uint256 startTimestamp = OPERATOR_SET_GENESIS_REWARDS_TIMESTAMP; + + IRewardsCoordinator.OperatorSetRewardsSubmission[] memory rewardsSubmissions = new IRewardsCoordinator.OperatorSetRewardsSubmission[](1); + rewardsSubmissions[0] = IRewardsCoordinator.OperatorSetRewardsSubmission({ + rewardType: IRewardsCoordinator.RewardType.DELEGATED_STAKE, + operatorSetId: defaultOperatorSetId, + strategiesAndMultipliers: defaultStrategyAndMultipliers, + token: IERC20(address(this)), + amount: 1, + startTimestamp: uint32(startTimestamp), + duration: validDuration + }); + + cheats.prank(defaultAVS); + cheats.expectRevert("RewardsCoordinator._validateRewardsSubmission: startTimestamp too far in the past"); + rewardsCoordinator.rewardOperatorSetForRange(rewardsSubmissions); + } + + function test_Revert_StartTimestampTooFarInFuture() public { + cheats.warp(OPERATOR_SET_GENESIS_REWARDS_TIMESTAMP); + + uint256 startTimestamp = OPERATOR_SET_GENESIS_REWARDS_TIMESTAMP + MAX_FUTURE_LENGTH + CALCULATION_INTERVAL_SECONDS; + + IRewardsCoordinator.OperatorSetRewardsSubmission[] memory rewardsSubmissions = new IRewardsCoordinator.OperatorSetRewardsSubmission[](1); + rewardsSubmissions[0] = IRewardsCoordinator.OperatorSetRewardsSubmission({ + rewardType: IRewardsCoordinator.RewardType.DELEGATED_STAKE, + operatorSetId: defaultOperatorSetId, + strategiesAndMultipliers: defaultStrategyAndMultipliers, + token: IERC20(address(this)), + amount: 1, + startTimestamp: uint32(startTimestamp), + duration: validDuration + }); + + cheats.prank(defaultAVS); + cheats.expectRevert("RewardsCoordinator._validateRewardsSubmission: startTimestamp too far in the future"); + rewardsCoordinator.rewardOperatorSetForRange(rewardsSubmissions); + } + + function test_Revert_InvalidStrategyConsidered() public { + cheats.warp(OPERATOR_SET_GENESIS_REWARDS_TIMESTAMP); + defaultStrategyAndMultipliers[0].strategy = IStrategy(address(999)); + + IRewardsCoordinator.OperatorSetRewardsSubmission[] memory rewardsSubmissions = new IRewardsCoordinator.OperatorSetRewardsSubmission[](1); + rewardsSubmissions[0] = IRewardsCoordinator.OperatorSetRewardsSubmission({ + rewardType: IRewardsCoordinator.RewardType.DELEGATED_STAKE, + operatorSetId: defaultOperatorSetId, + strategiesAndMultipliers: defaultStrategyAndMultipliers, + token: IERC20(address(this)), + amount: 1, + startTimestamp: validStartTimestamp, + duration: validDuration + }); + + cheats.prank(defaultAVS); + cheats.expectRevert("RewardsCoordinator._validateRewardsSubmission: invalid strategy considered"); + rewardsCoordinator.rewardOperatorSetForRange(rewardsSubmissions); + } + + function test_Revert_StrategiesNotOrdered() public { + cheats.warp(OPERATOR_SET_GENESIS_REWARDS_TIMESTAMP); + + IRewardsCoordinator.OperatorSetRewardsSubmission[] memory rewardsSubmissions = new IRewardsCoordinator.OperatorSetRewardsSubmission[](1); + IRewardsCoordinator.StrategyAndMultiplier[] + memory dupStratsAndMultipliers = new IRewardsCoordinator.StrategyAndMultiplier[](2); + dupStratsAndMultipliers[0] = defaultStrategyAndMultipliers[0]; + dupStratsAndMultipliers[1] = defaultStrategyAndMultipliers[0]; + rewardsSubmissions[0] = IRewardsCoordinator.OperatorSetRewardsSubmission({ + rewardType: IRewardsCoordinator.RewardType.DELEGATED_STAKE, + operatorSetId: defaultOperatorSetId, + strategiesAndMultipliers: dupStratsAndMultipliers, + token: IERC20(address(this)), + amount: 1, + startTimestamp: validStartTimestamp, + duration: validDuration + }); + + cheats.prank(defaultAVS); + cheats.expectRevert("RewardsCoordinator._validateRewardsSubmission: strategies must be in ascending order to handle duplicates"); + rewardsCoordinator.rewardOperatorSetForRange(rewardsSubmissions); + } + + function testFuzz_RewardOperatorSetForRange_SingleSubmission( + uint256 startTimestamp, + uint256 duration, + uint256 amount + ) public { + cheats.warp(OPERATOR_SET_GENESIS_REWARDS_TIMESTAMP); + + // 1. Bound fuzz inputs to valid ranges and amounts + IERC20 rewardToken = new ERC20PresetFixedSupply("dog wif hat", "MOCK1", mockTokenInitialSupply, defaultAVS); + amount = bound(amount, 1, mockTokenInitialSupply); + duration = bound(duration, 0, MAX_REWARDS_DURATION); + duration = duration - (duration % CALCULATION_INTERVAL_SECONDS); + startTimestamp = bound( + startTimestamp, + uint256(_maxTimestamp(OPERATOR_SET_GENESIS_REWARDS_TIMESTAMP, uint32(block.timestamp) - OPERATOR_SET_MAX_RETROACTIVE_LENGTH)) + + CALCULATION_INTERVAL_SECONDS - + 1, + block.timestamp + uint256(MAX_FUTURE_LENGTH) + ); + startTimestamp = startTimestamp - (startTimestamp % CALCULATION_INTERVAL_SECONDS); + + // 2. Create rewards submission input param + IRewardsCoordinator.OperatorSetRewardsSubmission[] memory rewardsSubmissions = new IRewardsCoordinator.OperatorSetRewardsSubmission[](1); + rewardsSubmissions[0] = IRewardsCoordinator.OperatorSetRewardsSubmission({ + rewardType: IRewardsCoordinator.RewardType.DELEGATED_STAKE, + operatorSetId: defaultOperatorSetId, + strategiesAndMultipliers: defaultStrategyAndMultipliers, + token: rewardToken, + amount: amount, + startTimestamp: uint32(startTimestamp), + duration: uint32(duration) + }); + + // 3. call createAVSRewardsSubmission() with expected event emitted + uint256 avsBalanceBefore = rewardToken.balanceOf(defaultAVS); + uint256 rewardsCoordinatorBalanceBefore = rewardToken.balanceOf(address(rewardsCoordinator)); + + cheats.startPrank(defaultAVS); + rewardToken.approve(address(rewardsCoordinator), amount); + uint256 currSubmissionNonce = rewardsCoordinator.submissionNonce(defaultAVS); + bytes32 rewardsSubmissionHash = keccak256(abi.encode(defaultAVS, currSubmissionNonce, rewardsSubmissions[0])); + + cheats.expectEmit(true, true, true, true, address(rewardsCoordinator)); + emit OperatorSetRewardCreated(defaultAVS, currSubmissionNonce, rewardsSubmissionHash, rewardsSubmissions[0]); + rewardsCoordinator.rewardOperatorSetForRange(rewardsSubmissions); + cheats.stopPrank(); + + assertTrue(rewardsCoordinator.isAVSRewardsSubmissionHash(defaultAVS, rewardsSubmissionHash), "rewards submission hash not submitted"); + assertEq(currSubmissionNonce + 1, rewardsCoordinator.submissionNonce(defaultAVS), "submission nonce not incremented"); + assertEq( + avsBalanceBefore - amount, + rewardToken.balanceOf(defaultAVS), + "AVS balance not decremented by amount of rewards submission" + ); + assertEq( + rewardsCoordinatorBalanceBefore + amount, + rewardToken.balanceOf(address(rewardsCoordinator)), + "RewardsCoordinator balance not incremented by amount of rewards submission" + ); + } + + /** + * @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_RewardOperatorSetForRange_MultipleSubmissions( + uint256 startTimestamp, + uint256 duration, + uint256 amount, + uint256 numSubmissions + ) public { + cheats.assume(2 <= numSubmissions && numSubmissions <= 10); + cheats.warp(OPERATOR_SET_GENESIS_REWARDS_TIMESTAMP); + + IRewardsCoordinator.OperatorSetRewardsSubmission[] memory rewardsSubmissions = new IRewardsCoordinator.OperatorSetRewardsSubmission[](numSubmissions); + bytes32[] memory rewardsSubmissionHashes = new bytes32[](numSubmissions); + uint256 startSubmissionNonce = rewardsCoordinator.submissionNonce(defaultAVS); + _deployMockRewardTokens(defaultAVS, numSubmissions); + + uint256[] memory avsBalancesBefore = _getBalanceForTokens(rewardTokens, defaultAVS); + uint256[] memory rewardsCoordinatorBalancesBefore = _getBalanceForTokens( + rewardTokens, + address(rewardsCoordinator) + ); + uint256[] memory amounts = new uint256[](numSubmissions); + + // Create multiple rewards submissions and their expected event + for (uint256 i = 0; i < numSubmissions; ++i) { + // 1. Bound fuzz inputs to valid ranges and amounts using randSeed for each + amount = bound(amount + i, 1, mockTokenInitialSupply); + amounts[i] = amount; + duration = bound(duration + i, 0, MAX_REWARDS_DURATION); + duration = duration - (duration % CALCULATION_INTERVAL_SECONDS); + startTimestamp = bound( + startTimestamp + i, + uint256(_maxTimestamp(OPERATOR_SET_GENESIS_REWARDS_TIMESTAMP, uint32(block.timestamp) - OPERATOR_SET_MAX_RETROACTIVE_LENGTH)) + + CALCULATION_INTERVAL_SECONDS - + 1, + block.timestamp + uint256(MAX_FUTURE_LENGTH) + ); + startTimestamp = startTimestamp - (startTimestamp % CALCULATION_INTERVAL_SECONDS); + + // 2. Create rewards submission input param + IRewardsCoordinator.OperatorSetRewardsSubmission memory rewardsSubmission = IRewardsCoordinator.OperatorSetRewardsSubmission({ + rewardType: IRewardsCoordinator.RewardType.DELEGATED_STAKE, + operatorSetId: defaultOperatorSetId, + strategiesAndMultipliers: defaultStrategyAndMultipliers, + token: rewardTokens[i], + amount: amounts[i], + startTimestamp: uint32(startTimestamp), + duration: uint32(duration) + }); + rewardsSubmissions[i] = rewardsSubmission; + + // 3. expected event emitted for this rewardsSubmission + rewardsSubmissionHashes[i] = keccak256(abi.encode(defaultAVS, startSubmissionNonce + i, rewardsSubmissions[i])); + cheats.expectEmit(true, true, true, true, address(rewardsCoordinator)); + emit OperatorSetRewardCreated(defaultAVS, startSubmissionNonce + i, rewardsSubmissionHashes[i], rewardsSubmissions[i]); + } + + // 4. call createAVSRewardsSubmission() + cheats.prank(defaultAVS); + rewardsCoordinator.rewardOperatorSetForRange(rewardsSubmissions); + + // 5. Check for submissionNonce() and rewardsSubmissionHashes being set + assertEq( + startSubmissionNonce + numSubmissions, + rewardsCoordinator.submissionNonce(defaultAVS), + "submission nonce not incremented properly" + ); + + for (uint256 i = 0; i < numSubmissions; ++i) { + assertTrue( + rewardsCoordinator.isAVSRewardsSubmissionHash(defaultAVS, rewardsSubmissionHashes[i]), + "rewards submission hash not submitted" + ); + assertEq( + avsBalancesBefore[i] - amounts[i], + rewardTokens[i].balanceOf(defaultAVS), + "AVS balance not decremented by amount of rewards submission" + ); + assertEq( + rewardsCoordinatorBalancesBefore[i] + amounts[i], + rewardTokens[i].balanceOf(address(rewardsCoordinator)), + "RewardsCoordinator balance not incremented by amount of rewards submission" + ); + } + } +} diff --git a/src/test/unit/StrategyBaseTVLLimitsUnit.sol b/src/test/unit/StrategyBaseTVLLimitsUnit.sol index 6a2b1d8f9..78bdcefac 100644 --- a/src/test/unit/StrategyBaseTVLLimitsUnit.sol +++ b/src/test/unit/StrategyBaseTVLLimitsUnit.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.12; +pragma solidity ^0.8.27; import "./StrategyBaseUnit.t.sol"; diff --git a/src/test/unit/StrategyBaseUnit.t.sol b/src/test/unit/StrategyBaseUnit.t.sol index a8c8e47f0..57431326f 100644 --- a/src/test/unit/StrategyBaseUnit.t.sol +++ b/src/test/unit/StrategyBaseUnit.t.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.12; +pragma solidity ^0.8.27; import "@openzeppelin/contracts/token/ERC20/presets/ERC20PresetFixedSupply.sol"; import "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol"; diff --git a/src/test/unit/StrategyFactoryUnit.t.sol b/src/test/unit/StrategyFactoryUnit.t.sol index d8bd92858..8f793ce29 100644 --- a/src/test/unit/StrategyFactoryUnit.t.sol +++ b/src/test/unit/StrategyFactoryUnit.t.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.12; +pragma solidity ^0.8.27; import "@openzeppelin/contracts/token/ERC20/presets/ERC20PresetFixedSupply.sol"; import "@openzeppelin/contracts/proxy/beacon/UpgradeableBeacon.sol"; @@ -116,7 +116,6 @@ contract StrategyFactoryUnitTests is EigenLayerUnitTestSetup { require(newStrategy.pauserRegistry() == pauserRegistry, "pauserRegistry not set correctly"); require(newStrategy.underlyingToken() == underlyingToken, "underlyingToken not set correctly"); require(strategyManagerMock.strategyIsWhitelistedForDeposit(newStrategy), "underlyingToken is not whitelisted"); - require(!strategyManagerMock.thirdPartyTransfersForbidden(newStrategy), "newStrategy has 3rd party transfers forbidden"); } function test_deployNewStrategy_revert_StrategyAlreadyExists() public { @@ -159,38 +158,18 @@ contract StrategyFactoryUnitTests is EigenLayerUnitTestSetup { function test_whitelistStrategies() public { StrategyBase strategy = _deployStrategy(); IStrategy[] memory strategiesToWhitelist = new IStrategy[](1); - bool[] memory thirdPartyTransfersForbiddenValues = new bool[](1); strategiesToWhitelist[0] = strategy; - thirdPartyTransfersForbiddenValues[0] = true; - strategyFactory.whitelistStrategies(strategiesToWhitelist, thirdPartyTransfersForbiddenValues); + strategyFactory.whitelistStrategies(strategiesToWhitelist); assertTrue(strategyManagerMock.strategyIsWhitelistedForDeposit(strategy), "Strategy not whitelisted"); - require(strategyManagerMock.thirdPartyTransfersForbidden(strategy), "3rd party transfers forbidden not set correctly"); } function test_whitelistStrategies_revert_notOwner() public { IStrategy[] memory strategiesToWhitelist = new IStrategy[](1); - bool[] memory thirdPartyTransfersForbiddenValues = new bool[](1); cheats.expectRevert("Ownable: caller is not the owner"); cheats.prank(notOwner); - strategyFactory.whitelistStrategies(strategiesToWhitelist, thirdPartyTransfersForbiddenValues); - } - - function test_setThirdPartyTransfersForbidden_revert_notOwner() public { - IStrategy strategy; - - cheats.expectRevert("Ownable: caller is not the owner"); - cheats.prank(notOwner); - strategyFactory.setThirdPartyTransfersForbidden(strategy, true); - } - - function test_setThirdPartyTransfersFrobidden() public { - StrategyBase strategy = _deployStrategy(); - bool thirdPartyTransfersForbidden = true; - - strategyFactory.setThirdPartyTransfersForbidden(strategy, thirdPartyTransfersForbidden); - assertTrue(strategyManagerMock.thirdPartyTransfersForbidden(strategy), "3rd party transfers forbidden not set"); + strategyFactory.whitelistStrategies(strategiesToWhitelist); } function test_removeStrategiesFromWhitelist_revert_notOwner() public { diff --git a/src/test/unit/StrategyManagerUnit.t.sol b/src/test/unit/StrategyManagerUnit.t.sol index 189c495cd..a89a6012a 100644 --- a/src/test/unit/StrategyManagerUnit.t.sol +++ b/src/test/unit/StrategyManagerUnit.t.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.12; +pragma solidity ^0.8.27; import "@openzeppelin/contracts/mocks/ERC1271WalletMock.sol"; import "src/contracts/core/StrategyManager.sol"; @@ -37,7 +37,7 @@ contract StrategyManagerUnitTests is EigenLayerUnitTestSetup, IStrategyManagerEv function setUp() public override { EigenLayerUnitTestSetup.setUp(); - strategyManagerImplementation = new StrategyManager(delegationManagerMock, eigenPodManagerMock, slasherMock); + strategyManagerImplementation = new StrategyManager(delegationManagerMock, eigenPodManagerMock, slasherMock, avsDirectoryMock); strategyManager = StrategyManager( address( new TransparentUpgradeableProxy( @@ -66,17 +66,12 @@ contract StrategyManagerUnitTests is EigenLayerUnitTestSetup, IStrategyManagerEv _strategies[0] = dummyStrat; _strategies[1] = dummyStrat2; _strategies[2] = dummyStrat3; - bool[] memory _thirdPartyTransfersForbiddenValues = new bool[](3); - _thirdPartyTransfersForbiddenValues[0] = false; - _thirdPartyTransfersForbiddenValues[1] = false; - _thirdPartyTransfersForbiddenValues[2] = false; for (uint256 i = 0; i < _strategies.length; ++i) { cheats.expectEmit(true, true, true, true, address(strategyManager)); emit StrategyAddedToDepositWhitelist(_strategies[i]); - cheats.expectEmit(true, true, true, true, address(strategyManager)); - emit UpdatedThirdPartyTransfersForbidden(_strategies[i], _thirdPartyTransfersForbiddenValues[i]); + } - strategyManager.addStrategiesToDepositWhitelist(_strategies, _thirdPartyTransfersForbiddenValues); + strategyManager.addStrategiesToDepositWhitelist(_strategies); addressIsExcludedFromFuzzedInputs[address(reenterer)] = true; } @@ -219,7 +214,6 @@ contract StrategyManagerUnitTests is EigenLayerUnitTestSetup, IStrategyManagerEv */ function _addStrategiesToWhitelist(uint8 numberOfStrategiesToAdd) internal returns (IStrategy[] memory) { IStrategy[] memory strategyArray = new IStrategy[](numberOfStrategiesToAdd); - bool[] memory thirdPartyTransfersForbiddenValues = new bool[](numberOfStrategiesToAdd); // loop that deploys a new strategy and adds it to the array for (uint256 i = 0; i < numberOfStrategiesToAdd; ++i) { IStrategy _strategy = _deployNewStrategy(dummyToken, strategyManager, pauserRegistry, dummyAdmin); @@ -232,7 +226,7 @@ contract StrategyManagerUnitTests is EigenLayerUnitTestSetup, IStrategyManagerEv cheats.expectEmit(true, true, true, true, address(strategyManager)); emit StrategyAddedToDepositWhitelist(strategyArray[i]); } - strategyManager.addStrategiesToDepositWhitelist(strategyArray, thirdPartyTransfersForbiddenValues); + strategyManager.addStrategiesToDepositWhitelist(strategyArray); for (uint256 i = 0; i < numberOfStrategiesToAdd; ++i) { assertTrue(strategyManager.strategyIsWhitelistedForDeposit(strategyArray[i]), "strategy not whitelisted"); @@ -342,13 +336,12 @@ contract StrategyManagerUnitTests_depositIntoStrategy is StrategyManagerUnitTest // whitelist the strategy for deposit cheats.startPrank(strategyManager.owner()); IStrategy[] memory _strategy = new IStrategy[](1); - bool[] memory thirdPartyTransfersForbiddenValues = new bool[](1); _strategy[0] = IStrategy(address(reenterer)); for (uint256 i = 0; i < _strategy.length; ++i) { cheats.expectEmit(true, true, true, true, address(strategyManager)); emit StrategyAddedToDepositWhitelist(_strategy[i]); } - strategyManager.addStrategiesToDepositWhitelist(_strategy, thirdPartyTransfersForbiddenValues); + strategyManager.addStrategiesToDepositWhitelist(_strategy); cheats.stopPrank(); reenterer.prepareReturnData(abi.encode(amount)); @@ -374,10 +367,9 @@ contract StrategyManagerUnitTests_depositIntoStrategy is StrategyManagerUnitTest // whitelist the strategy for deposit cheats.startPrank(strategyManager.owner()); IStrategy[] memory _strategy = new IStrategy[](1); - bool[] memory _thirdPartyTransfersForbiddenValues = new bool[](1); _strategy[0] = dummyStrat; - strategyManager.addStrategiesToDepositWhitelist(_strategy, _thirdPartyTransfersForbiddenValues); + strategyManager.addStrategiesToDepositWhitelist(_strategy); cheats.stopPrank(); address staker = address(this); @@ -398,9 +390,8 @@ contract StrategyManagerUnitTests_depositIntoStrategy is StrategyManagerUnitTest // whitelist the strategy for deposit cheats.startPrank(strategyManager.owner()); IStrategy[] memory _strategy = new IStrategy[](1); - bool[] memory _thirdPartyTransfersForbiddenValues = new bool[](1); _strategy[0] = dummyStrat; - strategyManager.addStrategiesToDepositWhitelist(_strategy, _thirdPartyTransfersForbiddenValues); + strategyManager.addStrategiesToDepositWhitelist(_strategy); cheats.stopPrank(); address staker = address(this); @@ -420,9 +411,8 @@ contract StrategyManagerUnitTests_depositIntoStrategy is StrategyManagerUnitTest // whitelist the strategy for deposit cheats.startPrank(strategyManager.owner()); IStrategy[] memory _strategy = new IStrategy[](1); - bool[] memory _thirdPartyTransfersForbiddenValues = new bool[](1); _strategy[0] = dummyStrat; - strategyManager.addStrategiesToDepositWhitelist(_strategy, _thirdPartyTransfersForbiddenValues); + strategyManager.addStrategiesToDepositWhitelist(_strategy); cheats.stopPrank(); address staker = address(this); @@ -442,10 +432,9 @@ contract StrategyManagerUnitTests_depositIntoStrategy is StrategyManagerUnitTest // whitelist the strategy for deposit cheats.startPrank(strategyManager.owner()); IStrategy[] memory _strategy = new IStrategy[](1); - bool[] memory _thirdPartyTransfersForbiddenValues = new bool[](1); _strategy[0] = dummyStrat; - strategyManager.addStrategiesToDepositWhitelist(_strategy, _thirdPartyTransfersForbiddenValues); + strategyManager.addStrategiesToDepositWhitelist(_strategy); cheats.stopPrank(); address staker = address(this); @@ -480,10 +469,9 @@ contract StrategyManagerUnitTests_depositIntoStrategy is StrategyManagerUnitTest // whitelist the strategy for deposit cheats.startPrank(strategyManager.owner()); IStrategy[] memory _strategy = new IStrategy[](1); - bool[] memory _thirdPartyTransfersForbiddenValues = new bool[](1); _strategy[0] = dummyStrat; - strategyManager.addStrategiesToDepositWhitelist(_strategy, _thirdPartyTransfersForbiddenValues); + strategyManager.addStrategiesToDepositWhitelist(_strategy); cheats.stopPrank(); address staker = address(this); @@ -692,15 +680,13 @@ contract StrategyManagerUnitTests_depositIntoStrategyWithSignature is StrategyMa // whitelist the strategy for deposit cheats.startPrank(strategyManager.owner()); IStrategy[] memory _strategy = new IStrategy[](1); - bool[] memory _thirdPartyTransfersForbiddenValues = new bool[](1); - _strategy[0] = IStrategy(address(reenterer)); for (uint256 i = 0; i < _strategy.length; ++i) { cheats.expectEmit(true, true, true, true, address(strategyManager)); emit StrategyAddedToDepositWhitelist(_strategy[i]); } - strategyManager.addStrategiesToDepositWhitelist(_strategy, _thirdPartyTransfersForbiddenValues); + strategyManager.addStrategiesToDepositWhitelist(_strategy); cheats.stopPrank(); address staker = cheats.addr(privateKey); @@ -786,19 +772,6 @@ contract StrategyManagerUnitTests_depositIntoStrategyWithSignature is StrategyMa memory expectedRevertMessage = "StrategyManager.onlyStrategiesWhitelistedForDeposit: strategy not whitelisted"; _depositIntoStrategyWithSignature(staker, amount, type(uint256).max, expectedRevertMessage); } - - function testFuzz_Revert_WhenThirdPartyTransfersForbidden(uint256 amount, uint256 expiry) public { - // min shares must be minted on strategy - cheats.assume(amount >= 1); - - cheats.prank(strategyManager.strategyWhitelister()); - strategyManager.setThirdPartyTransfersForbidden(dummyStrat, true); - - address staker = cheats.addr(privateKey); - // not expecting a revert, so input an empty string - string memory expectedRevertMessage = "StrategyManager.depositIntoStrategyWithSignature: third transfers disabled"; - _depositIntoStrategyWithSignature(staker, amount, expiry, expectedRevertMessage); - } } contract StrategyManagerUnitTests_removeShares is StrategyManagerUnitTests { @@ -848,7 +821,7 @@ contract StrategyManagerUnitTests_removeShares is StrategyManagerUnitTests { * @notice deposit single strategy and removeShares() for less than the deposited amount * Shares should be updated correctly with stakerStrategyListLength unchanged */ - function testFuzz_RemoveSharesLessThanDeposit( + function testFuzz_RemoveScaledSharesLessThanDeposit( address staker, uint256 depositAmount, uint256 removeSharesAmount @@ -950,7 +923,7 @@ contract StrategyManagerUnitTests_removeShares is StrategyManagerUnitTests { * Removing Shares could result in removing from staker strategy list if depositAmounts[i] == sharesAmounts[i]. * Only callable by DelegationManager */ - function testFuzz_RemoveShares(uint256[3] memory depositAmounts, uint256[3] memory sharesAmounts) external { + function testFuzz_RemoveScaledShares(uint256[3] memory depositAmounts, uint256[3] memory sharesAmounts) external { address staker = address(this); IStrategy[] memory strategies = new IStrategy[](3); strategies[0] = dummyStrat; @@ -1042,7 +1015,7 @@ contract StrategyManagerUnitTests_addShares is StrategyManagerUnitTests { assertTrue(_isDepositedStrategy(staker, dummyStrat), "strategy should be deposited"); } - function testFuzz_AddSharesToExistingShares( + function testFuzz_AddScaledSharesToExistingShares( address staker, uint256 sharesAmount ) external filterFuzzedAddressInputs(staker) { @@ -1090,10 +1063,9 @@ contract StrategyManagerUnitTests_addShares is StrategyManagerUnitTests { // whitelist the strategy for deposit cheats.startPrank(strategyManager.owner()); IStrategy[] memory _strategy = new IStrategy[](1); - bool[] memory _thirdPartyTransfersForbiddenValues = new bool[](1); _strategy[0] = dummyStrat; - strategyManager.addStrategiesToDepositWhitelist(_strategy, _thirdPartyTransfersForbiddenValues); + strategyManager.addStrategiesToDepositWhitelist(_strategy); cheats.stopPrank(); } @@ -1184,43 +1156,38 @@ contract StrategyManagerUnitTests_addStrategiesToDepositWhitelist is StrategyMan ) external filterFuzzedAddressInputs(notStrategyWhitelister) { cheats.assume(notStrategyWhitelister != strategyManager.strategyWhitelister()); IStrategy[] memory strategyArray = new IStrategy[](1); - bool[] memory thirdPartyTransfersForbiddenValues = new bool[](1); IStrategy _strategy = _deployNewStrategy(dummyToken, strategyManager, pauserRegistry, dummyAdmin); strategyArray[0] = _strategy; cheats.prank(notStrategyWhitelister); cheats.expectRevert("StrategyManager.onlyStrategyWhitelister: not the strategyWhitelister"); - strategyManager.addStrategiesToDepositWhitelist(strategyArray, thirdPartyTransfersForbiddenValues); + strategyManager.addStrategiesToDepositWhitelist(strategyArray); } function test_AddSingleStrategyToWhitelist() external { IStrategy[] memory strategyArray = new IStrategy[](1); - bool[] memory thirdPartyTransfersForbiddenValues = new bool[](1); IStrategy strategy = _deployNewStrategy(dummyToken, strategyManager, pauserRegistry, dummyAdmin); strategyArray[0] = strategy; assertFalse(strategyManager.strategyIsWhitelistedForDeposit(strategy), "strategy should not be whitelisted"); cheats.expectEmit(true, true, true, true, address(strategyManager)); emit StrategyAddedToDepositWhitelist(strategy); - strategyManager.addStrategiesToDepositWhitelist(strategyArray, thirdPartyTransfersForbiddenValues); + strategyManager.addStrategiesToDepositWhitelist(strategyArray); assertTrue(strategyManager.strategyIsWhitelistedForDeposit(strategy), "strategy should be whitelisted"); } function test_AddAlreadyWhitelistedStrategy() external { IStrategy[] memory strategyArray = new IStrategy[](1); - bool[] memory thirdPartyTransfersForbiddenValues = new bool[](1); IStrategy strategy = _deployNewStrategy(dummyToken, strategyManager, pauserRegistry, dummyAdmin); strategyArray[0] = strategy; assertFalse(strategyManager.strategyIsWhitelistedForDeposit(strategy), "strategy should not be whitelisted"); cheats.expectEmit(true, true, true, true, address(strategyManager)); emit StrategyAddedToDepositWhitelist(strategy); - cheats.expectEmit(true, true, true, true, address(strategyManager)); - emit UpdatedThirdPartyTransfersForbidden(strategy, false); - strategyManager.addStrategiesToDepositWhitelist(strategyArray, thirdPartyTransfersForbiddenValues); + strategyManager.addStrategiesToDepositWhitelist(strategyArray); assertTrue(strategyManager.strategyIsWhitelistedForDeposit(strategy), "strategy should be whitelisted"); // Make sure event not emitted by checking logs length cheats.recordLogs(); uint256 numLogsBefore = cheats.getRecordedLogs().length; - strategyManager.addStrategiesToDepositWhitelist(strategyArray, thirdPartyTransfersForbiddenValues); + strategyManager.addStrategiesToDepositWhitelist(strategyArray); uint256 numLogsAfter = cheats.getRecordedLogs().length; assertEq(numLogsBefore, numLogsAfter, "event emitted when strategy already whitelisted"); assertTrue(strategyManager.strategyIsWhitelistedForDeposit(strategy), "strategy should still be whitelisted"); @@ -1272,12 +1239,11 @@ contract StrategyManagerUnitTests_removeStrategiesFromDepositWhitelist is Strate IStrategy[] memory strategyArray = new IStrategy[](1); IStrategy strategy = _deployNewStrategy(dummyToken, strategyManager, pauserRegistry, dummyAdmin); strategyArray[0] = strategy; - bool[] memory thirdPartyTransfersForbiddenValues = new bool[](1); assertFalse(strategyManager.strategyIsWhitelistedForDeposit(strategy), "strategy should not be whitelisted"); // Add strategy to whitelist first cheats.expectEmit(true, true, true, true, address(strategyManager)); emit StrategyAddedToDepositWhitelist(strategy); - strategyManager.addStrategiesToDepositWhitelist(strategyArray, thirdPartyTransfersForbiddenValues); + strategyManager.addStrategiesToDepositWhitelist(strategyArray); assertTrue(strategyManager.strategyIsWhitelistedForDeposit(strategy), "strategy should be whitelisted"); // Now remove strategy from whitelist diff --git a/src/test/utils/BeaconChainProofsWrapper.sol b/src/test/utils/BeaconChainProofsWrapper.sol index d093848d4..d8e4aff10 100644 --- a/src/test/utils/BeaconChainProofsWrapper.sol +++ b/src/test/utils/BeaconChainProofsWrapper.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.12; +pragma solidity ^0.8.27; import "src/contracts/libraries/BeaconChainProofs.sol"; diff --git a/src/test/utils/EigenLayerUnitTestBase.sol b/src/test/utils/EigenLayerUnitTestBase.sol index 9a776e9bf..ebd48d846 100644 --- a/src/test/utils/EigenLayerUnitTestBase.sol +++ b/src/test/utils/EigenLayerUnitTestBase.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.12; +pragma solidity ^0.8.27; import "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol"; import "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; diff --git a/src/test/utils/EigenLayerUnitTestSetup.sol b/src/test/utils/EigenLayerUnitTestSetup.sol index ee2664f23..6939fd7d2 100644 --- a/src/test/utils/EigenLayerUnitTestSetup.sol +++ b/src/test/utils/EigenLayerUnitTestSetup.sol @@ -1,10 +1,11 @@ // SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.12; +pragma solidity ^0.8.27; import "src/test/mocks/StrategyManagerMock.sol"; import "src/test/mocks/DelegationManagerMock.sol"; import "src/test/mocks/SlasherMock.sol"; import "src/test/mocks/EigenPodManagerMock.sol"; +import "src/test/mocks/AVSDirectoryMock.sol"; import "src/test/utils/EigenLayerUnitTestBase.sol"; abstract contract EigenLayerUnitTestSetup is EigenLayerUnitTestBase { @@ -13,6 +14,7 @@ abstract contract EigenLayerUnitTestSetup is EigenLayerUnitTestBase { DelegationManagerMock public delegationManagerMock; SlasherMock public slasherMock; EigenPodManagerMock public eigenPodManagerMock; + AVSDirectoryMock public avsDirectoryMock; function setUp() public virtual override { EigenLayerUnitTestBase.setUp(); @@ -20,6 +22,7 @@ abstract contract EigenLayerUnitTestSetup is EigenLayerUnitTestBase { delegationManagerMock = new DelegationManagerMock(); slasherMock = new SlasherMock(); eigenPodManagerMock = new EigenPodManagerMock(pauserRegistry); + avsDirectoryMock = new AVSDirectoryMock(); addressIsExcludedFromFuzzedInputs[address(0)] = true; addressIsExcludedFromFuzzedInputs[address(strategyManagerMock)] = true; diff --git a/src/test/utils/EigenPodUser.t.sol b/src/test/utils/EigenPodUser.t.sol index 8e62b26ef..54dbe6f5d 100644 --- a/src/test/utils/EigenPodUser.t.sol +++ b/src/test/utils/EigenPodUser.t.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.12; +pragma solidity ^0.8.27; import "forge-std/Test.sol"; diff --git a/src/test/utils/Operators.sol b/src/test/utils/Operators.sol index 7c5faabd6..7863b5ae4 100644 --- a/src/test/utils/Operators.sol +++ b/src/test/utils/Operators.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.12; +pragma solidity ^0.8.27; import "forge-std/Test.sol"; import "forge-std/Script.sol"; diff --git a/src/test/utils/Owners.sol b/src/test/utils/Owners.sol index 9c32971ab..f16c17c6d 100644 --- a/src/test/utils/Owners.sol +++ b/src/test/utils/Owners.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.12; +pragma solidity ^0.8.27; import "forge-std/Test.sol"; import "forge-std/Script.sol"; diff --git a/src/test/utils/ProofParsing.sol b/src/test/utils/ProofParsing.sol index e3607e07b..ebc3e6b6b 100644 --- a/src/test/utils/ProofParsing.sol +++ b/src/test/utils/ProofParsing.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.12; +pragma solidity ^0.8.27; import "forge-std/Test.sol"; import "forge-std/StdJson.sol"; diff --git a/src/test/utils/SignatureCompaction.sol b/src/test/utils/SignatureCompaction.sol index c10b2db1d..0bb98a1c0 100644 --- a/src/test/utils/SignatureCompaction.sol +++ b/src/test/utils/SignatureCompaction.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.12; +pragma solidity ^0.8.27; import "@openzeppelin/contracts/utils/cryptography/ECDSA.sol"; diff --git a/src/test/utils/Utils.sol b/src/test/utils/Utils.sol index 10c5653eb..935febc89 100644 --- a/src/test/utils/Utils.sol +++ b/src/test/utils/Utils.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.8.12; +pragma solidity ^0.8.27; import "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; import "src/contracts/strategies/StrategyBase.sol";